diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..f173110 --- /dev/null +++ b/.nojekyll @@ -0,0 +1 @@ +This file makes sure that Github Pages doesn't process mdBook's output. diff --git a/404.html b/404.html new file mode 100644 index 0000000..e1eeaf0 --- /dev/null +++ b/404.html @@ -0,0 +1,285 @@ + + + + + + Page not found - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

Document not found (404)

+

This URL is invalid, sorry. Please use the navigation bar or search to continue.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FontAwesome/css/font-awesome.css b/FontAwesome/css/font-awesome.css new file mode 100644 index 0000000..540440c --- /dev/null +++ b/FontAwesome/css/font-awesome.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/FontAwesome/fonts/FontAwesome.ttf b/FontAwesome/fonts/FontAwesome.ttf new file mode 100644 index 0000000..35acda2 Binary files /dev/null and b/FontAwesome/fonts/FontAwesome.ttf differ diff --git a/FontAwesome/fonts/fontawesome-webfont.eot b/FontAwesome/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..e9f60ca Binary files /dev/null and b/FontAwesome/fonts/fontawesome-webfont.eot differ diff --git a/FontAwesome/fonts/fontawesome-webfont.svg b/FontAwesome/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..855c845 --- /dev/null +++ b/FontAwesome/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FontAwesome/fonts/fontawesome-webfont.ttf b/FontAwesome/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..35acda2 Binary files /dev/null and b/FontAwesome/fonts/fontawesome-webfont.ttf differ diff --git a/FontAwesome/fonts/fontawesome-webfont.woff b/FontAwesome/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..400014a Binary files /dev/null and b/FontAwesome/fonts/fontawesome-webfont.woff differ diff --git a/FontAwesome/fonts/fontawesome-webfont.woff2 b/FontAwesome/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000..4d13fc6 Binary files /dev/null and b/FontAwesome/fonts/fontawesome-webfont.woff2 differ diff --git a/ace.js b/ace.js new file mode 100644 index 0000000..e8435a5 --- /dev/null +++ b/ace.js @@ -0,0 +1,43 @@ +/* +Copyright (c) 2010, Ajax.org B.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Ajax.org B.V. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +(function(){function o(n){var i=e;n&&(e[n]||(e[n]={}),i=e[n]);if(!i.define||!i.define.packaged)t.original=i.define,i.define=t,i.define.packaged=!0;if(!i.require||!i.require.packaged)r.original=i.require,i.require=r,i.require.packaged=!0}var ACE_NAMESPACE = "ace",e=function(){return this}();!e&&typeof window!="undefined"&&(e=window);if(!ACE_NAMESPACE&&typeof requirejs!="undefined")return;var t=function(e,n,r){if(typeof e!="string"){t.original?t.original.apply(this,arguments):(console.error("dropping module because define wasn't a string."),console.trace());return}arguments.length==2&&(r=n),t.modules[e]||(t.payloads[e]=r,t.modules[e]=null)};t.modules={},t.payloads={};var n=function(e,t,n){if(typeof t=="string"){var i=s(e,t);if(i!=undefined)return n&&n(),i}else if(Object.prototype.toString.call(t)==="[object Array]"){var o=[];for(var u=0,a=t.length;u1&&u(t,"")>-1&&(a=RegExp(this.source,r.replace.call(o(this),"g","")),r.replace.call(e.slice(t.index),a,function(){for(var e=1;et.index&&this.lastIndex--}return t},s||(RegExp.prototype.test=function(e){var t=r.exec.call(this,e);return t&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--,!!t})}),ace.define("ace/lib/es5-shim",["require","exports","module"],function(e,t,n){function r(){}function w(e){try{return Object.defineProperty(e,"sentinel",{}),"sentinel"in e}catch(t){}}function H(e){return e=+e,e!==e?e=0:e!==0&&e!==1/0&&e!==-1/0&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}function B(e){var t=typeof e;return e===null||t==="undefined"||t==="boolean"||t==="number"||t==="string"}function j(e){var t,n,r;if(B(e))return e;n=e.valueOf;if(typeof n=="function"){t=n.call(e);if(B(t))return t}r=e.toString;if(typeof r=="function"){t=r.call(e);if(B(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(typeof n!="function")throw new TypeError("Function.prototype.bind called on incompatible "+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var i=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=i.bind(o.toString),f=i.bind(o.hasOwnProperty),l,c,h,p,d;if(d=f(o,"__defineGetter__"))l=i.bind(o.__defineGetter__),c=i.bind(o.__defineSetter__),h=i.bind(o.__lookupGetter__),p=i.bind(o.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,"XXX"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+ta)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else{this.length=c+s;for(h=0;h>>0;if(a(t)!="[object Function]")throw new TypeError;while(++s>>0,s=Array(i),o=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var u=0;u>>0,s=[],o,u=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var f=0;f>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduce of empty array with no initial value");var s=0,o;if(arguments.length>=2)o=arguments[1];else do{if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError("reduce of empty array with no initial value")}while(!0);for(;s>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduceRight of empty array with no initial value");var s,o=i-1;if(arguments.length>=2)s=arguments[1];else do{if(o in r){s=r[o--];break}if(--o<0)throw new TypeError("reduceRight of empty array with no initial value")}while(!0);do o in this&&(s=t.call(void 0,s,r[o],o,n));while(o--);return s});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(t){var n=g&&a(this)=="[object String]"?this.split(""):F(this),r=n.length>>>0;if(!r)return-1;var i=0;arguments.length>1&&(i=H(arguments[1])),i=i>=0?i:Math.max(0,r+i);for(;i>>0;if(!r)return-1;var i=r-1;arguments.length>1&&(i=Math.min(i,H(arguments[1]))),i=i>=0?i:r-Math.abs(i);for(;i>=0;i--)if(i in n&&t===n[i])return i;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)});if(!Object.getOwnPropertyDescriptor){var y="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(t,n){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(y+t);if(!f(t,n))return;var r,i,s;r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);t.__proto__=u;if(i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)});if(!Object.create){var b;Object.prototype.__proto__===null?b=function(){return{__proto__:null}}:b=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(t===null)r=b();else{if(typeof t!="object")throw new TypeError("typeof prototype["+typeof t+"] != 'object'");var i=function(){};i.prototype=t,r=new i,r.__proto__=t}return n!==void 0&&Object.defineProperties(r,n),r}}if(Object.defineProperty){var E=w({}),S=typeof document=="undefined"||w(document.createElement("div"));if(!E||!S)var x=Object.defineProperty}if(!Object.defineProperty||x){var T="Property description must be an object: ",N="Object.defineProperty called on non-object: ",C="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(t,n,r){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(N+t);if(typeof r!="object"&&typeof r!="function"||r===null)throw new TypeError(T+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,"value"))if(d&&(h(t,n)||p(t,n))){var s=t.__proto__;t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s}else t[n]=r.value;else{if(!d)throw new TypeError(C);f(r,"get")&&l(t,n,r.get),f(r,"set")&&c(t,n,r.set)}return t}}Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return typeof n=="function"?n:t(n)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;var n="";while(f(t,n))n+="?";t[n]=!0;var r=f(t,n);return delete t[n],r});if(!Object.keys){var L=!0,A=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],O=A.length;for(var M in{toString:null})L=!1;Object.keys=function I(e){if(typeof e!="object"&&typeof e!="function"||e===null)throw new TypeError("Object.keys called on a non-object");var I=[];for(var t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n=0?parseFloat((i.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]):parseFloat((i.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]),t.isOldIE=t.isIE&&t.isIE<9,t.isGecko=t.isMozilla=i.match(/ Gecko\/\d+/),t.isOpera=window.opera&&Object.prototype.toString.call(window.opera)=="[object Opera]",t.isWebKit=parseFloat(i.split("WebKit/")[1])||undefined,t.isChrome=parseFloat(i.split(" Chrome/")[1])||undefined,t.isEdge=parseFloat(i.split(" Edge/")[1])||undefined,t.isAIR=i.indexOf("AdobeAIR")>=0,t.isIPad=i.indexOf("iPad")>=0,t.isAndroid=i.indexOf("Android")>=0,t.isChromeOS=i.indexOf(" CrOS ")>=0,t.isIOS=/iPad|iPhone|iPod/.test(i)&&!window.MSStream,t.isIOS&&(t.isMac=!0),t.isMobile=t.isIPad||t.isAndroid}),ace.define("ace/lib/dom",["require","exports","module","ace/lib/useragent"],function(e,t,n){"use strict";var r=e("./useragent"),i="http://www.w3.org/1999/xhtml";t.buildDom=function o(e,t,n){if(typeof e=="string"&&e){var r=document.createTextNode(e);return t&&t.appendChild(r),r}if(!Array.isArray(e))return e;if(typeof e[0]!="string"||!e[0]){var i=[];for(var s=0;s=1.5:!0;if(typeof document!="undefined"){var s=document.createElement("div");t.HI_DPI&&s.style.transform!==undefined&&(t.HAS_CSS_TRANSFORMS=!0),!r.isEdge&&typeof s.style.animationName!="undefined"&&(t.HAS_CSS_ANIMATION=!0),s=null}t.HAS_CSS_TRANSFORMS?t.translate=function(e,t,n){e.style.transform="translate("+Math.round(t)+"px, "+Math.round(n)+"px)"}:t.translate=function(e,t,n){e.style.top=Math.round(n)+"px",e.style.left=Math.round(t)+"px"}}),ace.define("ace/lib/oop",["require","exports","module"],function(e,t,n){"use strict";t.inherits=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})},t.mixin=function(e,t){for(var n in t)e[n]=t[n];return e},t.implement=function(e,n){t.mixin(e,n)}}),ace.define("ace/lib/keys",["require","exports","module","ace/lib/oop"],function(e,t,n){"use strict";var r=e("./oop"),i=function(){var e={MODIFIER_KEYS:{16:"Shift",17:"Ctrl",18:"Alt",224:"Meta"},KEY_MODS:{ctrl:1,alt:2,option:2,shift:4,"super":8,meta:8,command:8,cmd:8},FUNCTION_KEYS:{8:"Backspace",9:"Tab",13:"Return",19:"Pause",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"Print",45:"Insert",46:"Delete",96:"Numpad0",97:"Numpad1",98:"Numpad2",99:"Numpad3",100:"Numpad4",101:"Numpad5",102:"Numpad6",103:"Numpad7",104:"Numpad8",105:"Numpad9","-13":"NumpadEnter",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"Numlock",145:"Scrolllock"},PRINTABLE_KEYS:{32:" ",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",61:"=",65:"a",66:"b",67:"c",68:"d",69:"e",70:"f",71:"g",72:"h",73:"i",74:"j",75:"k",76:"l",77:"m",78:"n",79:"o",80:"p",81:"q",82:"r",83:"s",84:"t",85:"u",86:"v",87:"w",88:"x",89:"y",90:"z",107:"+",109:"-",110:".",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",111:"/",106:"*"}},t,n;for(n in e.FUNCTION_KEYS)t=e.FUNCTION_KEYS[n].toLowerCase(),e[t]=parseInt(n,10);for(n in e.PRINTABLE_KEYS)t=e.PRINTABLE_KEYS[n].toLowerCase(),e[t]=parseInt(n,10);return r.mixin(e,e.MODIFIER_KEYS),r.mixin(e,e.PRINTABLE_KEYS),r.mixin(e,e.FUNCTION_KEYS),e.enter=e["return"],e.escape=e.esc,e.del=e["delete"],e[173]="-",function(){var t=["cmd","ctrl","alt","shift"];for(var n=Math.pow(2,t.length);n--;)e.KEY_MODS[n]=t.filter(function(t){return n&e.KEY_MODS[t]}).join("-")+"-"}(),e.KEY_MODS[0]="",e.KEY_MODS[-1]="input-",e}();r.mixin(t,i),t.keyCodeToString=function(e){var t=i[e];return typeof t!="string"&&(t=String.fromCharCode(e)),t.toLowerCase()}}),ace.define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,n){"use strict";function a(e,t,n){var a=u(t);if(!i.isMac&&s){t.getModifierState&&(t.getModifierState("OS")||t.getModifierState("Win"))&&(a|=8);if(s.altGr){if((3&a)==3)return;s.altGr=0}if(n===18||n===17){var f="location"in t?t.location:t.keyLocation;if(n===17&&f===1)s[n]==1&&(o=t.timeStamp);else if(n===18&&a===3&&f===2){var l=t.timeStamp-o;l<50&&(s.altGr=!0)}}}n in r.MODIFIER_KEYS&&(n=-1),a&8&&n>=91&&n<=93&&(n=-1);if(!a&&n===13){var f="location"in t?t.location:t.keyLocation;if(f===3){e(t,a,-n);if(t.defaultPrevented)return}}if(i.isChromeOS&&a&8){e(t,a,n);if(t.defaultPrevented)return;a&=-9}return!!a||n in r.FUNCTION_KEYS||n in r.PRINTABLE_KEYS?e(t,a,n):!1}function f(){s=Object.create(null)}var r=e("./keys"),i=e("./useragent"),s=null,o=0;t.addListener=function(e,t,n){if(e.addEventListener)return e.addEventListener(t,n,!1);if(e.attachEvent){var r=function(){n.call(e,window.event)};n._wrapper=r,e.attachEvent("on"+t,r)}},t.removeListener=function(e,t,n){if(e.removeEventListener)return e.removeEventListener(t,n,!1);e.detachEvent&&e.detachEvent("on"+t,n._wrapper||n)},t.stopEvent=function(e){return t.stopPropagation(e),t.preventDefault(e),!1},t.stopPropagation=function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},t.preventDefault=function(e){e.preventDefault?e.preventDefault():e.returnValue=!1},t.getButton=function(e){return e.type=="dblclick"?0:e.type=="contextmenu"||i.isMac&&e.ctrlKey&&!e.altKey&&!e.shiftKey?2:e.preventDefault?e.button:{1:0,2:2,4:1}[e.button]},t.capture=function(e,n,r){function i(e){n&&n(e),r&&r(e),t.removeListener(document,"mousemove",n,!0),t.removeListener(document,"mouseup",i,!0),t.removeListener(document,"dragstart",i,!0)}return t.addListener(document,"mousemove",n,!0),t.addListener(document,"mouseup",i,!0),t.addListener(document,"dragstart",i,!0),i},t.addTouchMoveListener=function(e,n){var r,i;t.addListener(e,"touchstart",function(e){var t=e.touches,n=t[0];r=n.clientX,i=n.clientY}),t.addListener(e,"touchmove",function(e){var t=e.touches;if(t.length>1)return;var s=t[0];e.wheelX=r-s.clientX,e.wheelY=i-s.clientY,r=s.clientX,i=s.clientY,n(e)})},t.addMouseWheelListener=function(e,n){"onmousewheel"in e?t.addListener(e,"mousewheel",function(e){var t=8;e.wheelDeltaX!==undefined?(e.wheelX=-e.wheelDeltaX/t,e.wheelY=-e.wheelDeltaY/t):(e.wheelX=0,e.wheelY=-e.wheelDelta/t),n(e)}):"onwheel"in e?t.addListener(e,"wheel",function(e){var t=.35;switch(e.deltaMode){case e.DOM_DELTA_PIXEL:e.wheelX=e.deltaX*t||0,e.wheelY=e.deltaY*t||0;break;case e.DOM_DELTA_LINE:case e.DOM_DELTA_PAGE:e.wheelX=(e.deltaX||0)*5,e.wheelY=(e.deltaY||0)*5}n(e)}):t.addListener(e,"DOMMouseScroll",function(e){e.axis&&e.axis==e.HORIZONTAL_AXIS?(e.wheelX=(e.detail||0)*5,e.wheelY=0):(e.wheelX=0,e.wheelY=(e.detail||0)*5),n(e)})},t.addMultiMouseDownListener=function(e,n,r,s){function c(e){t.getButton(e)!==0?o=0:e.detail>1?(o++,o>4&&(o=1)):o=1;if(i.isIE){var c=Math.abs(e.clientX-u)>5||Math.abs(e.clientY-a)>5;if(!f||c)o=1;f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),o==1&&(u=e.clientX,a=e.clientY)}e._clicks=o,r[s]("mousedown",e);if(o>4)o=0;else if(o>1)return r[s](l[o],e)}function h(e){o=2,f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),r[s]("mousedown",e),r[s](l[o],e)}var o=0,u,a,f,l={2:"dblclick",3:"tripleclick",4:"quadclick"};Array.isArray(e)||(e=[e]),e.forEach(function(e){t.addListener(e,"mousedown",c),i.isOldIE&&t.addListener(e,"dblclick",h)})};var u=!i.isMac||!i.isOpera||"KeyboardEvent"in window?function(e){return 0|(e.ctrlKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.metaKey?8:0)}:function(e){return 0|(e.metaKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.ctrlKey?8:0)};t.getModifierString=function(e){return r.KEY_MODS[u(e)]},t.addCommandKeyListener=function(e,n){var r=t.addListener;if(i.isOldGecko||i.isOpera&&!("KeyboardEvent"in window)){var o=null;r(e,"keydown",function(e){o=e.keyCode}),r(e,"keypress",function(e){return a(n,e,o)})}else{var u=null;r(e,"keydown",function(e){s[e.keyCode]=(s[e.keyCode]||0)+1;var t=a(n,e,e.keyCode);return u=e.defaultPrevented,t}),r(e,"keypress",function(e){u&&(e.ctrlKey||e.altKey||e.shiftKey||e.metaKey)&&(t.stopEvent(e),u=null)}),r(e,"keyup",function(e){s[e.keyCode]=null}),s||(f(),r(window,"focus",f))}};if(typeof window=="object"&&window.postMessage&&!i.isOldIE){var l=1;t.nextTick=function(e,n){n=n||window;var r="zero-timeout-message-"+l++,i=function(s){s.data==r&&(t.stopPropagation(s),t.removeListener(n,"message",i),e())};t.addListener(n,"message",i),n.postMessage(r,"*")}}t.$idleBlocked=!1,t.onIdle=function(e,n){return setTimeout(function r(){t.$idleBlocked?setTimeout(r,100):e()},n)},t.$idleBlockId=null,t.blockIdle=function(e){t.$idleBlockId&&clearTimeout(t.$idleBlockId),t.$idleBlocked=!0,t.$idleBlockId=setTimeout(function(){t.$idleBlocked=!1},e||100)},t.nextFrame=typeof window=="object"&&(window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame),t.nextFrame?t.nextFrame=t.nextFrame.bind(window):t.nextFrame=function(e){setTimeout(e,17)}}),ace.define("ace/range",["require","exports","module"],function(e,t,n){"use strict";var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e=="object"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e=="object"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?tthis.end.column?1:0:ethis.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.rowt)var r={row:t+1,column:0};else if(this.start.row0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\s\s*/,i=/\s\s*$/;t.stringTrimLeft=function(e){return e.replace(r,"")},t.stringTrimRight=function(e){return e.replace(i,"")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n63,l=400,c=e("../lib/keys"),h=c.KEY_MODS,p=i.isIOS,d=p?/\s/:/\n/,v=function(e,t){function W(){x=!0,n.blur(),n.focus(),x=!1}function V(e){e.keyCode==27&&n.value.lengthC&&T[s]=="\n")o=c.end;else if(rC&&T.slice(0,s).split("\n").length>2)o=c.down;else if(s>C&&T[s-1]==" ")o=c.right,u=h.option;else if(s>C||s==C&&C!=N&&r==s)o=c.right;r!==s&&(u|=h.shift),o&&(t.onCommandKey(null,u,o),N=r,C=s,A(""))};document.addEventListener("selectionchange",s),t.on("destroy",function(){document.removeEventListener("selectionchange",s)})}var n=s.createElement("textarea");n.className="ace_text-input",n.setAttribute("wrap","off"),n.setAttribute("autocorrect","off"),n.setAttribute("autocapitalize","off"),n.setAttribute("spellcheck",!1),n.style.opacity="0",e.insertBefore(n,e.firstChild);var v=!1,m=!1,g=!1,y=!1,b="",w=!0,E=!1;i.isMobile||(n.style.fontSize="1px");var S=!1,x=!1,T="",N=0,C=0;try{var k=document.activeElement===n}catch(L){}r.addListener(n,"blur",function(e){if(x)return;t.onBlur(e),k=!1}),r.addListener(n,"focus",function(e){if(x)return;k=!0;if(i.isEdge)try{if(!document.hasFocus())return}catch(e){}t.onFocus(e),i.isEdge?setTimeout(A):A()}),this.$focusScroll=!1,this.focus=function(){if(b||f||this.$focusScroll=="browser")return n.focus({preventScroll:!0});var e=n.style.top;n.style.position="fixed",n.style.top="0px";try{var t=n.getBoundingClientRect().top!=0}catch(r){return}var i=[];if(t){var s=n.parentElement;while(s&&s.nodeType==1)i.push(s),s.setAttribute("ace_nocontext",!0),!s.parentElement&&s.getRootNode?s=s.getRootNode().host:s=s.parentElement}n.focus({preventScroll:!0}),t&&i.forEach(function(e){e.removeAttribute("ace_nocontext")}),setTimeout(function(){n.style.position="",n.style.top=="0px"&&(n.style.top=e)},0)},this.blur=function(){n.blur()},this.isFocused=function(){return k},t.on("beforeEndOperation",function(){if(t.curOp&&t.curOp.command.name=="insertstring")return;g&&(T=n.value="",z()),A()});var A=p?function(e){if(!k||v&&!e||y)return;e||(e="");var r="\n ab"+e+"cde fg\n";r!=n.value&&(n.value=T=r);var i=4,s=4+(e.length||(t.selection.isEmpty()?0:1));(N!=i||C!=s)&&n.setSelectionRange(i,s),N=i,C=s}:function(){if(g||y)return;if(!k&&!D)return;g=!0;var e=t.selection,r=e.getRange(),i=e.cursor.row,s=r.start.column,o=r.end.column,u=t.session.getLine(i);if(r.start.row!=i){var a=t.session.getLine(i-1);s=r.start.rowi+1?f.length:o,o+=u.length+1,u=u+"\n"+f}u.length>l&&(s=T.length&&e.value===T&&T&&e.selectionEnd!==C},M=function(e){if(g)return;v?v=!1:O(n)&&(t.selectAll(),A())},_=null;this.setInputHandler=function(e){_=e},this.getInputHandler=function(){return _};var D=!1,P=function(e,r){D&&(D=!1);if(m)return A(),e&&t.onPaste(e),m=!1,"";var i=n.selectionStart,s=n.selectionEnd,o=N,u=T.length-C,a=e,f=e.length-i,l=e.length-s,c=0;while(o>0&&T[c]==e[c])c++,o--;a=a.slice(c),c=1;while(u>0&&T.length-c>N-1&&T[T.length-c]==e[e.length-c])c++,u--;return f-=c-1,l-=c-1,a=a.slice(0,a.length-c+1),!r&&f==a.length&&!o&&!u&&!l?"":(y=!0,a&&!o&&!u&&!f&&!l||S?t.onTextInput(a):t.onTextInput(a,{extendLeft:o,extendRight:u,restoreStart:f,restoreEnd:l}),y=!1,T=e,N=i,C=s,a)},H=function(e){if(g)return U();var t=n.value,r=P(t,!0);(t.length>l+100||d.test(r))&&A()},B=function(e,t,n){var r=e.clipboardData||window.clipboardData;if(!r||u)return;var i=a||n?"Text":"text/plain";try{return t?r.setData(i,t)!==!1:r.getData(i)}catch(e){if(!n)return B(e,t,!0)}},j=function(e,i){var s=t.getCopyText();if(!s)return r.preventDefault(e);B(e,s)?(p&&(A(s),v=s,setTimeout(function(){v=!1},10)),i?t.onCut():t.onCopy(),r.preventDefault(e)):(v=!0,n.value=s,n.select(),setTimeout(function(){v=!1,A(),i?t.onCut():t.onCopy()}))},F=function(e){j(e,!0)},I=function(e){j(e,!1)},q=function(e){var s=B(e);typeof s=="string"?(s&&t.onPaste(s,e),i.isIE&&setTimeout(A),r.preventDefault(e)):(n.value="",m=!0)};r.addCommandKeyListener(n,t.onCommandKey.bind(t)),r.addListener(n,"select",M),r.addListener(n,"input",H),r.addListener(n,"cut",F),r.addListener(n,"copy",I),r.addListener(n,"paste",q),(!("oncut"in n)||!("oncopy"in n)||!("onpaste"in n))&&r.addListener(e,"keydown",function(e){if(i.isMac&&!e.metaKey||!e.ctrlKey)return;switch(e.keyCode){case 67:I(e);break;case 86:q(e);break;case 88:F(e)}});var R=function(e){if(g||!t.onCompositionStart||t.$readOnly)return;g={};if(S)return;setTimeout(U,0),t.on("mousedown",W);var r=t.getSelectionRange();r.end.row=r.start.row,r.end.column=r.start.column,g.markerRange=r,g.selectionStart=N,t.onCompositionStart(g),g.useTextareaForIME?(n.value="",T="",N=0,C=0):(n.msGetInputContext&&(g.context=n.msGetInputContext()),n.getInputContext&&(g.context=n.getInputContext()))},U=function(){if(!g||!t.onCompositionUpdate||t.$readOnly)return;if(S)return W();if(g.useTextareaForIME)t.onCompositionUpdate(n.value);else{var e=n.value;P(e),g.markerRange&&(g.context&&(g.markerRange.start.column=g.selectionStart=g.context.compositionStartOffset),g.markerRange.end.column=g.markerRange.start.column+C-g.selectionStart)}},z=function(e){if(!t.onCompositionEnd||t.$readOnly)return;g=!1,t.onCompositionEnd(),t.off("mousedown",W),e&&H()},X=o.delayedCall(U,50).schedule.bind(null,null);r.addListener(n,"compositionstart",R),r.addListener(n,"compositionupdate",U),r.addListener(n,"keyup",V),r.addListener(n,"keydown",X),r.addListener(n,"compositionend",z),this.getElement=function(){return n},this.setCommandMode=function(e){S=e,n.readOnly=!1},this.setReadOnly=function(e){S||(n.readOnly=e)},this.setCopyWithEmptySelection=function(e){E=e},this.onContextMenu=function(e){D=!0,A(),t._emit("nativecontextmenu",{target:t,domEvent:e}),this.moveToMouse(e,!0)},this.moveToMouse=function(e,o){b||(b=n.style.cssText),n.style.cssText=(o?"z-index:100000;":"")+(i.isIE?"opacity:0.1;":"")+"text-indent: -"+(N+C)*t.renderer.characterWidth*.5+"px;";var u=t.container.getBoundingClientRect(),a=s.computedStyle(t.container),f=u.top+(parseInt(a.borderTopWidth)||0),l=u.left+(parseInt(u.borderLeftWidth)||0),c=u.bottom-f-n.clientHeight-2,h=function(e){n.style.left=e.clientX-l-2+"px",n.style.top=Math.min(e.clientY-f-2,c)+"px"};h(e);if(e.type!="mousedown")return;t.renderer.$keepTextAreaAtCursor&&(t.renderer.$keepTextAreaAtCursor=null),clearTimeout($),i.isWin&&r.capture(t.container,h,J)},this.onContextMenuClose=J;var $,K=function(e){t.textInput.onContextMenu(e),J()};r.addListener(n,"mouseup",K),r.addListener(n,"mousedown",function(e){e.preventDefault(),J()}),r.addListener(t.renderer.scroller,"contextmenu",K),r.addListener(n,"contextmenu",K),p&&Q(e,t,n)};t.TextInput=v}),ace.define("ace/mouse/default_handlers",["require","exports","module","ace/lib/useragent"],function(e,t,n){"use strict";function o(e){e.$clickSelection=null;var t=e.editor;t.setDefaultHandler("mousedown",this.onMouseDown.bind(e)),t.setDefaultHandler("dblclick",this.onDoubleClick.bind(e)),t.setDefaultHandler("tripleclick",this.onTripleClick.bind(e)),t.setDefaultHandler("quadclick",this.onQuadClick.bind(e)),t.setDefaultHandler("mousewheel",this.onMouseWheel.bind(e)),t.setDefaultHandler("touchmove",this.onTouchMove.bind(e));var n=["select","startSelect","selectEnd","selectAllEnd","selectByWordsEnd","selectByLinesEnd","dragWait","dragWaitEnd","focusWait"];n.forEach(function(t){e[t]=this[t]},this),e.selectByLines=this.extendSelectionBy.bind(e,"getLineRange"),e.selectByWords=this.extendSelectionBy.bind(e,"getWordRange")}function u(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}function a(e,t){if(e.start.row==e.end.row)var n=2*t.column-e.start.column-e.end.column;else if(e.start.row==e.end.row-1&&!e.start.column&&!e.end.column)var n=t.column-4;else var n=2*t.row-e.start.row-e.end.row;return n<0?{cursor:e.start,anchor:e.end}:{cursor:e.end,anchor:e.start}}var r=e("../lib/useragent"),i=0,s=550;(function(){this.onMouseDown=function(e){var t=e.inSelection(),n=e.getDocumentPosition();this.mousedownEvent=e;var i=this.editor,s=e.getButton();if(s!==0){var o=i.getSelectionRange(),u=o.isEmpty();(u||s==1)&&i.selection.moveToPosition(n),s==2&&(i.textInput.onContextMenu(e.domEvent),r.isMozilla||e.preventDefault());return}this.mousedownEvent.time=Date.now();if(t&&!i.isFocused()){i.focus();if(this.$focusTimeout&&!this.$clickSelection&&!i.inMultiSelectMode){this.setState("focusWait"),this.captureMouse(e);return}}return this.captureMouse(e),this.startSelect(n,e.domEvent._clicks>1),e.preventDefault()},this.startSelect=function(e,t){e=e||this.editor.renderer.screenToTextCoordinates(this.x,this.y);var n=this.editor;if(!this.mousedownEvent)return;this.mousedownEvent.getShiftKey()?n.selection.selectToPosition(e):t||n.selection.moveToPosition(e),t||this.select(),n.renderer.scroller.setCapture&&n.renderer.scroller.setCapture(),n.setStyle("ace_selecting"),this.setState("select")},this.select=function(){var e,t=this.editor,n=t.renderer.screenToTextCoordinates(this.x,this.y);if(this.$clickSelection){var r=this.$clickSelection.comparePoint(n);if(r==-1)e=this.$clickSelection.end;else if(r==1)e=this.$clickSelection.start;else{var i=a(this.$clickSelection,n);n=i.cursor,e=i.anchor}t.selection.setSelectionAnchor(e.row,e.column)}t.selection.selectToPosition(n),t.renderer.scrollCursorIntoView()},this.extendSelectionBy=function(e){var t,n=this.editor,r=n.renderer.screenToTextCoordinates(this.x,this.y),i=n.selection[e](r.row,r.column);if(this.$clickSelection){var s=this.$clickSelection.comparePoint(i.start),o=this.$clickSelection.comparePoint(i.end);if(s==-1&&o<=0){t=this.$clickSelection.end;if(i.end.row!=r.row||i.end.column!=r.column)r=i.start}else if(o==1&&s>=0){t=this.$clickSelection.start;if(i.start.row!=r.row||i.start.column!=r.column)r=i.end}else if(s==-1&&o==1)r=i.end,t=i.start;else{var u=a(this.$clickSelection,r);r=u.cursor,t=u.anchor}n.selection.setSelectionAnchor(t.row,t.column)}n.selection.selectToPosition(r),n.renderer.scrollCursorIntoView()},this.selectEnd=this.selectAllEnd=this.selectByWordsEnd=this.selectByLinesEnd=function(){this.$clickSelection=null,this.editor.unsetStyle("ace_selecting"),this.editor.renderer.scroller.releaseCapture&&this.editor.renderer.scroller.releaseCapture()},this.focusWait=function(){var e=u(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y),t=Date.now();(e>i||t-this.mousedownEvent.time>this.$focusTimeout)&&this.startSelect(this.mousedownEvent.getDocumentPosition())},this.onDoubleClick=function(e){var t=e.getDocumentPosition(),n=this.editor,r=n.session,i=r.getBracketRange(t);i?(i.isEmpty()&&(i.start.column--,i.end.column++),this.setState("select")):(i=n.selection.getWordRange(t.row,t.column),this.setState("selectByWords")),this.$clickSelection=i,this.select()},this.onTripleClick=function(e){var t=e.getDocumentPosition(),n=this.editor;this.setState("selectByLines");var r=n.getSelectionRange();r.isMultiLine()&&r.contains(t.row,t.column)?(this.$clickSelection=n.selection.getLineRange(r.start.row),this.$clickSelection.end=n.selection.getLineRange(r.end.row).end):this.$clickSelection=n.selection.getLineRange(t.row),this.select()},this.onQuadClick=function(e){var t=this.editor;t.selectAll(),this.$clickSelection=t.getSelectionRange(),this.setState("selectAll")},this.onMouseWheel=function(e){if(e.getAccelKey())return;e.getShiftKey()&&e.wheelY&&!e.wheelX&&(e.wheelX=e.wheelY,e.wheelY=0);var t=this.editor;this.$lastScroll||(this.$lastScroll={t:0,vx:0,vy:0,allowed:0});var n=this.$lastScroll,r=e.domEvent.timeStamp,i=r-n.t,o=i?e.wheelX/i:n.vx,u=i?e.wheelY/i:n.vy;i=1&&t.renderer.isScrollableBy(e.wheelX*e.speed,0)&&(f=!0),a<=1&&t.renderer.isScrollableBy(0,e.wheelY*e.speed)&&(f=!0);if(f)n.allowed=r;else if(r-n.allowedt.session.documentToScreenRow(l.row,l.column))return c()}if(f==s)return;f=s.text.join("
"),i.setHtml(f),i.show(),t._signal("showGutterTooltip",i),t.on("mousewheel",c);if(e.$tooltipFollowsMouse)h(u);else{var p=u.domEvent.target,d=p.getBoundingClientRect(),v=i.getElement().style;v.left=d.right+"px",v.top=d.bottom+"px"}}function c(){o&&(o=clearTimeout(o)),f&&(i.hide(),f=null,t._signal("hideGutterTooltip",i),t.removeEventListener("mousewheel",c))}function h(e){i.setPosition(e.x,e.y)}var t=e.editor,n=t.renderer.$gutterLayer,i=new a(t.container);e.editor.setDefaultHandler("guttermousedown",function(r){if(!t.isFocused()||r.getButton()!=0)return;var i=n.getRegion(r);if(i=="foldWidgets")return;var s=r.getDocumentPosition().row,o=t.session.selection;if(r.getShiftKey())o.selectTo(s,0);else{if(r.domEvent.detail==2)return t.selectAll(),r.preventDefault();e.$clickSelection=t.selection.getLineRange(s)}return e.setState("selectByLines"),e.captureMouse(r),r.preventDefault()});var o,u,f;e.editor.setDefaultHandler("guttermousemove",function(t){var n=t.domEvent.target||t.domEvent.srcElement;if(r.hasCssClass(n,"ace_fold-widget"))return c();f&&e.$tooltipFollowsMouse&&h(t),u=t;if(o)return;o=setTimeout(function(){o=null,u&&!e.isMousePressed?l():c()},50)}),s.addListener(t.renderer.$gutter,"mouseout",function(e){u=null;if(!f||o)return;o=setTimeout(function(){o=null,c()},50)}),t.on("changeSession",c)}function a(e){o.call(this,e)}var r=e("../lib/dom"),i=e("../lib/oop"),s=e("../lib/event"),o=e("../tooltip").Tooltip;i.inherits(a,o),function(){this.setPosition=function(e,t){var n=window.innerWidth||document.documentElement.clientWidth,r=window.innerHeight||document.documentElement.clientHeight,i=this.getWidth(),s=this.getHeight();e+=15,t+=15,e+i>n&&(e-=e+i-n),t+s>r&&(t-=20+s),o.prototype.setPosition.call(this,e,t)}}.call(a.prototype),t.GutterHandler=u}),ace.define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=t.MouseEvent=function(e,t){this.domEvent=e,this.editor=t,this.x=this.clientX=e.clientX,this.y=this.clientY=e.clientY,this.$pos=null,this.$inSelection=null,this.propagationStopped=!1,this.defaultPrevented=!1};(function(){this.stopPropagation=function(){r.stopPropagation(this.domEvent),this.propagationStopped=!0},this.preventDefault=function(){r.preventDefault(this.domEvent),this.defaultPrevented=!0},this.stop=function(){this.stopPropagation(),this.preventDefault()},this.getDocumentPosition=function(){return this.$pos?this.$pos:(this.$pos=this.editor.renderer.screenToTextCoordinates(this.clientX,this.clientY),this.$pos)},this.inSelection=function(){if(this.$inSelection!==null)return this.$inSelection;var e=this.editor,t=e.getSelectionRange();if(t.isEmpty())this.$inSelection=!1;else{var n=this.getDocumentPosition();this.$inSelection=t.contains(n.row,n.column)}return this.$inSelection},this.getButton=function(){return r.getButton(this.domEvent)},this.getShiftKey=function(){return this.domEvent.shiftKey},this.getAccelKey=i.isMac?function(){return this.domEvent.metaKey}:function(){return this.domEvent.ctrlKey}}).call(s.prototype)}),ace.define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";function f(e){function T(e,n){var r=Date.now(),i=!n||e.row!=n.row,s=!n||e.column!=n.column;if(!S||i||s)t.moveCursorToPosition(e),S=r,x={x:p,y:d};else{var o=l(x.x,x.y,p,d);o>a?S=null:r-S>=u&&(t.renderer.scrollCursorIntoView(),S=null)}}function N(e,n){var r=Date.now(),i=t.renderer.layerConfig.lineHeight,s=t.renderer.layerConfig.characterWidth,u=t.renderer.scroller.getBoundingClientRect(),a={x:{left:p-u.left,right:u.right-p},y:{top:d-u.top,bottom:u.bottom-d}},f=Math.min(a.x.left,a.x.right),l=Math.min(a.y.top,a.y.bottom),c={row:e.row,column:e.column};f/s<=2&&(c.column+=a.x.left=o&&t.renderer.scrollCursorIntoView(c):E=r:E=null}function C(){var e=g;g=t.renderer.screenToTextCoordinates(p,d),T(g,e),N(g,e)}function k(){m=t.selection.toOrientedRange(),h=t.session.addMarker(m,"ace_selection",t.getSelectionStyle()),t.clearSelection(),t.isFocused()&&t.renderer.$cursorLayer.setBlinking(!1),clearInterval(v),C(),v=setInterval(C,20),y=0,i.addListener(document,"mousemove",O)}function L(){clearInterval(v),t.session.removeMarker(h),h=null,t.selection.fromOrientedRange(m),t.isFocused()&&!w&&t.renderer.$cursorLayer.setBlinking(!t.getReadOnly()),m=null,g=null,y=0,E=null,S=null,i.removeListener(document,"mousemove",O)}function O(){A==null&&(A=setTimeout(function(){A!=null&&h&&L()},20))}function M(e){var t=e.types;return!t||Array.prototype.some.call(t,function(e){return e=="text/plain"||e=="Text"})}function _(e){var t=["copy","copymove","all","uninitialized"],n=["move","copymove","linkmove","all","uninitialized"],r=s.isMac?e.altKey:e.ctrlKey,i="uninitialized";try{i=e.dataTransfer.effectAllowed.toLowerCase()}catch(e){}var o="none";return r&&t.indexOf(i)>=0?o="copy":n.indexOf(i)>=0?o="move":t.indexOf(i)>=0&&(o="copy"),o}var t=e.editor,n=r.createElement("img");n.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",s.isOpera&&(n.style.cssText="width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;");var f=["dragWait","dragWaitEnd","startDrag","dragReadyEnd","onMouseDrag"];f.forEach(function(t){e[t]=this[t]},this),t.addEventListener("mousedown",this.onMouseDown.bind(e));var c=t.container,h,p,d,v,m,g,y=0,b,w,E,S,x;this.onDragStart=function(e){if(this.cancelDrag||!c.draggable){var r=this;return setTimeout(function(){r.startSelect(),r.captureMouse(e)},0),e.preventDefault()}m=t.getSelectionRange();var i=e.dataTransfer;i.effectAllowed=t.getReadOnly()?"copy":"copyMove",s.isOpera&&(t.container.appendChild(n),n.scrollTop=0),i.setDragImage&&i.setDragImage(n,0,0),s.isOpera&&t.container.removeChild(n),i.clearData(),i.setData("Text",t.session.getTextRange()),w=!0,this.setState("drag")},this.onDragEnd=function(e){c.draggable=!1,w=!1,this.setState(null);if(!t.getReadOnly()){var n=e.dataTransfer.dropEffect;!b&&n=="move"&&t.session.remove(t.getSelectionRange()),t.renderer.$cursorLayer.setBlinking(!0)}this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle("")},this.onDragEnter=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||k(),y++,e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragOver=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||(k(),y++),A!==null&&(A=null),e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragLeave=function(e){y--;if(y<=0&&h)return L(),b=null,i.preventDefault(e)},this.onDrop=function(e){if(!g)return;var n=e.dataTransfer;if(w)switch(b){case"move":m.contains(g.row,g.column)?m={start:g,end:g}:m=t.moveText(m,g);break;case"copy":m=t.moveText(m,g,!0)}else{var r=n.getData("Text");m={start:g,end:t.session.insert(g,r)},t.focus(),b=null}return L(),i.preventDefault(e)},i.addListener(c,"dragstart",this.onDragStart.bind(e)),i.addListener(c,"dragend",this.onDragEnd.bind(e)),i.addListener(c,"dragenter",this.onDragEnter.bind(e)),i.addListener(c,"dragover",this.onDragOver.bind(e)),i.addListener(c,"dragleave",this.onDragLeave.bind(e)),i.addListener(c,"drop",this.onDrop.bind(e));var A=null}function l(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}var r=e("../lib/dom"),i=e("../lib/event"),s=e("../lib/useragent"),o=200,u=200,a=5;(function(){this.dragWait=function(){var e=Date.now()-this.mousedownEvent.time;e>this.editor.getDragDelay()&&this.startDrag()},this.dragWaitEnd=function(){var e=this.editor.container;e.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()),this.selectEnd()},this.dragReadyEnd=function(e){this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly()),this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle(""),this.dragWaitEnd()},this.startDrag=function(){this.cancelDrag=!1;var e=this.editor,t=e.container;t.draggable=!0,e.renderer.$cursorLayer.setBlinking(!1),e.setStyle("ace_dragging");var n=s.isWin?"default":"move";e.renderer.setCursorStyle(n),this.setState("dragReady")},this.onMouseDrag=function(e){var t=this.editor.container;if(s.isIE&&this.state=="dragReady"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>3&&t.dragDrop()}if(this.state==="dragWait"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>0&&(t.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()))}},this.onMouseDown=function(e){if(!this.$dragEnabled)return;this.mousedownEvent=e;var t=this.editor,n=e.inSelection(),r=e.getButton(),i=e.domEvent.detail||1;if(i===1&&r===0&&n){if(e.editor.inMultiSelectMode&&(e.getAccelKey()||e.getShiftKey()))return;this.mousedownEvent.time=Date.now();var o=e.domEvent.target||e.domEvent.srcElement;"unselectable"in o&&(o.unselectable="on");if(t.getDragDelay()){if(s.isWebKit){this.cancelDrag=!0;var u=t.container;u.draggable=!0}this.setState("dragWait")}else this.startDrag();this.captureMouse(e,this.onMouseDrag.bind(this)),e.defaultPrevented=!0}}}).call(f.prototype),t.DragdropHandler=f}),ace.define("ace/lib/net",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("./dom");t.get=function(e,t){var n=new XMLHttpRequest;n.open("GET",e,!0),n.onreadystatechange=function(){n.readyState===4&&t(n.responseText)},n.send(null)},t.loadScript=function(e,t){var n=r.getDocumentHead(),i=document.createElement("script");i.src=e,n.appendChild(i),i.onload=i.onreadystatechange=function(e,n){if(n||!i.readyState||i.readyState=="loaded"||i.readyState=="complete")i=i.onload=i.onreadystatechange=null,n||t()}},t.qualifyURL=function(e){var t=document.createElement("a");return t.href=e,t.href}}),ace.define("ace/lib/event_emitter",["require","exports","module"],function(e,t,n){"use strict";var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!="object"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),n=n.slice();for(var o=0;o1&&(i=n[n.length-2]);var o=a[t+"Path"];return o==null?o=a.basePath:r=="/"&&(t=r=""),o&&o.slice(-1)!="/"&&(o+="/"),o+t+r+i+this.get("suffix")},t.setModuleUrl=function(e,t){return a.$moduleUrls[e]=t},t.$loading={},t.loadModule=function(n,r){var i,o;Array.isArray(n)&&(o=n[0],n=n[1]);try{i=e(n)}catch(u){}if(i&&!t.$loading[n])return r&&r(i);t.$loading[n]||(t.$loading[n]=[]),t.$loading[n].push(r);if(t.$loading[n].length>1)return;var a=function(){e([n],function(e){t._emit("load.module",{name:n,module:e});var r=t.$loading[n];t.$loading[n]=null,r.forEach(function(t){t&&t(e)})})};if(!t.get("packaged"))return a();s.loadScript(t.moduleUrl(n,o),a),f()};var f=function(){!a.basePath&&!a.workerPath&&!a.modePath&&!a.themePath&&!Object.keys(a.$moduleUrls).length&&(console.error("Unable to infer path to ace from script src,","use ace.config.set('basePath', 'path') to enable dynamic loading of modes and themes","or with webpack use ace/webpack-resolver"),f=function(){})};t.init=l}),ace.define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event","ace/mouse/dragdrop_handler","ace/config"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=e("./default_handlers").DefaultHandlers,o=e("./default_gutter_handler").GutterHandler,u=e("./mouse_event").MouseEvent,a=e("./dragdrop_handler").DragdropHandler,f=e("../config"),l=function(e){var t=this;this.editor=e,new s(this),new o(this),new a(this);var n=function(t){var n=!document.hasFocus||!document.hasFocus()||!e.isFocused()&&document.activeElement==(e.textInput&&e.textInput.getElement());n&&window.focus(),e.focus()},u=e.renderer.getMouseEventTarget();r.addListener(u,"click",this.onMouseEvent.bind(this,"click")),r.addListener(u,"mousemove",this.onMouseMove.bind(this,"mousemove")),r.addMultiMouseDownListener([u,e.renderer.scrollBarV&&e.renderer.scrollBarV.inner,e.renderer.scrollBarH&&e.renderer.scrollBarH.inner,e.textInput&&e.textInput.getElement()].filter(Boolean),[400,300,250],this,"onMouseEvent"),r.addMouseWheelListener(e.container,this.onMouseWheel.bind(this,"mousewheel")),r.addTouchMoveListener(e.container,this.onTouchMove.bind(this,"touchmove"));var f=e.renderer.$gutter;r.addListener(f,"mousedown",this.onMouseEvent.bind(this,"guttermousedown")),r.addListener(f,"click",this.onMouseEvent.bind(this,"gutterclick")),r.addListener(f,"dblclick",this.onMouseEvent.bind(this,"gutterdblclick")),r.addListener(f,"mousemove",this.onMouseEvent.bind(this,"guttermousemove")),r.addListener(u,"mousedown",n),r.addListener(f,"mousedown",n),i.isIE&&e.renderer.scrollBarV&&(r.addListener(e.renderer.scrollBarV.element,"mousedown",n),r.addListener(e.renderer.scrollBarH.element,"mousedown",n)),e.on("mousemove",function(n){if(t.state||t.$dragDelay||!t.$dragEnabled)return;var r=e.renderer.screenToTextCoordinates(n.x,n.y),i=e.session.selection.getRange(),s=e.renderer;!i.isEmpty()&&i.insideStart(r.row,r.column)?s.setCursorStyle("default"):s.setCursorStyle("")})};(function(){this.onMouseEvent=function(e,t){this.editor._emit(e,new u(t,this.editor))},this.onMouseMove=function(e,t){var n=this.editor._eventRegistry&&this.editor._eventRegistry.mousemove;if(!n||!n.length)return;this.editor._emit(e,new u(t,this.editor))},this.onMouseWheel=function(e,t){var n=new u(t,this.editor);n.speed=this.$scrollSpeed*2,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.onTouchMove=function(e,t){var n=new u(t,this.editor);n.speed=1,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.setState=function(e){this.state=e},this.captureMouse=function(e,t){this.x=e.x,this.y=e.y,this.isMousePressed=!0;var n=this.editor,s=this.editor.renderer;s.$keepTextAreaAtCursor&&(s.$keepTextAreaAtCursor=null);var o=this,a=function(e){if(!e)return;if(i.isWebKit&&!e.which&&o.releaseMouse)return o.releaseMouse();o.x=e.clientX,o.y=e.clientY,t&&t(e),o.mouseEvent=new u(e,o.editor),o.$mouseMoved=!0},f=function(e){n.off("beforeEndOperation",c),clearInterval(h),l(),o[o.state+"End"]&&o[o.state+"End"](e),o.state="",s.$keepTextAreaAtCursor==null&&(s.$keepTextAreaAtCursor=!0,s.$moveTextAreaToCursor()),o.isMousePressed=!1,o.$onCaptureMouseMove=o.releaseMouse=null,e&&o.onMouseEvent("mouseup",e),n.endOperation()},l=function(){o[o.state]&&o[o.state](),o.$mouseMoved=!1};if(i.isOldIE&&e.domEvent.type=="dblclick")return setTimeout(function(){f(e)});var c=function(e){if(!o.releaseMouse)return;n.curOp.command.name&&n.curOp.selectionChanged&&(o[o.state+"End"]&&o[o.state+"End"](),o.state="",o.releaseMouse())};n.on("beforeEndOperation",c),n.startOperation({command:{name:"mouse"}}),o.$onCaptureMouseMove=a,o.releaseMouse=r.capture(this.editor.container,a,f);var h=setInterval(l,20)},this.releaseMouse=null,this.cancelContextMenu=function(){var e=function(t){if(t&&t.domEvent&&t.domEvent.type!="contextmenu")return;this.editor.off("nativecontextmenu",e),t&&t.domEvent&&r.stopEvent(t.domEvent)}.bind(this);setTimeout(e,10),this.editor.on("nativecontextmenu",e)}}).call(l.prototype),f.defineOptions(l.prototype,"mouseHandler",{scrollSpeed:{initialValue:2},dragDelay:{initialValue:i.isMac?150:0},dragEnabled:{initialValue:!0},focusTimeout:{initialValue:0},tooltipFollowsMouse:{initialValue:!0}}),t.MouseHandler=l}),ace.define("ace/mouse/fold_handler",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";function i(e){e.on("click",function(t){var n=t.getDocumentPosition(),i=e.session,s=i.getFoldAt(n.row,n.column,1);s&&(t.getAccelKey()?i.removeFold(s):i.expandFold(s),t.stop());var o=t.domEvent&&t.domEvent.target;o&&r.hasCssClass(o,"ace_inline_button")&&r.hasCssClass(o,"ace_toggle_wrap")&&(i.setOption("wrap",!0),e.renderer.scrollCursorIntoView())}),e.on("gutterclick",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session;i.foldWidgets&&i.foldWidgets[r]&&e.session.onFoldWidgetClick(r,t),e.isFocused()||e.focus(),t.stop()}}),e.on("gutterdblclick",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session,s=i.getParentFoldRangeData(r,!0),o=s.range||s.firstRange;if(o){r=o.start.row;var u=i.getFoldAt(r,i.getLine(r).length,1);u?i.removeFold(u):(i.addFold("...",o),e.renderer.scrollCursorIntoView({row:o.start.row,column:0}))}t.stop()}})}var r=e("../lib/dom");t.FoldHandler=i}),ace.define("ace/keyboard/keybinding",["require","exports","module","ace/lib/keys","ace/lib/event"],function(e,t,n){"use strict";var r=e("../lib/keys"),i=e("../lib/event"),s=function(e){this.$editor=e,this.$data={editor:e},this.$handlers=[],this.setDefaultHandler(e.commands)};(function(){this.setDefaultHandler=function(e){this.removeKeyboardHandler(this.$defaultHandler),this.$defaultHandler=e,this.addKeyboardHandler(e,0)},this.setKeyboardHandler=function(e){var t=this.$handlers;if(t[t.length-1]==e)return;while(t[t.length-1]&&t[t.length-1]!=this.$defaultHandler)this.removeKeyboardHandler(t[t.length-1]);this.addKeyboardHandler(e,1)},this.addKeyboardHandler=function(e,t){if(!e)return;typeof e=="function"&&!e.handleKeyboard&&(e.handleKeyboard=e);var n=this.$handlers.indexOf(e);n!=-1&&this.$handlers.splice(n,1),t==undefined?this.$handlers.push(e):this.$handlers.splice(t,0,e),n==-1&&e.attach&&e.attach(this.$editor)},this.removeKeyboardHandler=function(e){var t=this.$handlers.indexOf(e);return t==-1?!1:(this.$handlers.splice(t,1),e.detach&&e.detach(this.$editor),!0)},this.getKeyboardHandler=function(){return this.$handlers[this.$handlers.length-1]},this.getStatusText=function(){var e=this.$data,t=e.editor;return this.$handlers.map(function(n){return n.getStatusText&&n.getStatusText(t,e)||""}).filter(Boolean).join(" ")},this.$callKeyboardHandlers=function(e,t,n,r){var s,o=!1,u=this.$editor.commands;for(var a=this.$handlers.length;a--;){s=this.$handlers[a].handleKeyboard(this.$data,e,t,n,r);if(!s||!s.command)continue;s.command=="null"?o=!0:o=u.exec(s.command,this.$editor,s.args,r),o&&r&&e!=-1&&s.passEvent!=1&&s.command.passEvent!=1&&i.stopEvent(r);if(o)break}return!o&&e==-1&&(s={command:"insertstring"},o=u.exec("insertstring",this.$editor,t)),o&&this.$editor._signal&&this.$editor._signal("keyboardActivity",s),o},this.onCommandKey=function(e,t,n){var i=r.keyCodeToString(n);this.$callKeyboardHandlers(t,i,n,e)},this.onTextInput=function(e){this.$callKeyboardHandlers(-1,e)}}).call(s.prototype),t.KeyBinding=s}),ace.define("ace/lib/bidiutil",["require","exports","module"],function(e,t,n){"use strict";function F(e,t,n,r){var i=s?d:p,c=null,h=null,v=null,m=0,g=null,y=null,b=-1,w=null,E=null,T=[];if(!r)for(w=0,r=[];w0)if(g==16){for(w=b;w-1){for(w=b;w=0;C--){if(r[C]!=N)break;t[C]=s}}}function I(e,t,n){if(o=e){u=i+1;while(u=e)u++;for(a=i,l=u-1;a=t.length||(o=n[r-1])!=b&&o!=w||(c=t[r+1])!=b&&c!=w)return E;return u&&(c=w),c==o?c:E;case k:o=r>0?n[r-1]:S;if(o==b&&r+10&&n[r-1]==b)return b;if(u)return E;p=r+1,h=t.length;while(p=1425&&d<=2303||d==64286;o=t[p];if(v&&(o==y||o==T))return y}if(r<1||(o=t[r-1])==S)return E;return n[r-1];case S:return u=!1,f=!0,s;case x:return l=!0,E;case O:case M:case D:case P:case _:u=!1;case H:return E}}function R(e){var t=e.charCodeAt(0),n=t>>8;return n==0?t>191?g:B[t]:n==5?/[\u0591-\u05f4]/.test(e)?y:g:n==6?/[\u0610-\u061a\u064b-\u065f\u06d6-\u06e4\u06e7-\u06ed]/.test(e)?A:/[\u0660-\u0669\u066b-\u066c]/.test(e)?w:t==1642?L:/[\u06f0-\u06f9]/.test(e)?b:T:n==32&&t<=8287?j[t&255]:n==254?t>=65136?T:E:E}function U(e){return e>="\u064b"&&e<="\u0655"}var r=["\u0621","\u0641"],i=["\u063a","\u064a"],s=0,o=0,u=!1,a=!1,f=!1,l=!1,c=!1,h=!1,p=[[0,3,0,1,0,0,0],[0,3,0,1,2,2,0],[0,3,0,17,2,0,1],[0,3,5,5,4,1,0],[0,3,21,21,4,0,1],[0,3,5,5,4,2,0]],d=[[2,0,1,1,0,1,0],[2,0,1,1,0,2,0],[2,0,2,1,3,2,0],[2,0,2,33,3,1,1]],v=0,m=1,g=0,y=1,b=2,w=3,E=4,S=5,x=6,T=7,N=8,C=9,k=10,L=11,A=12,O=13,M=14,_=15,D=16,P=17,H=18,B=[H,H,H,H,H,H,H,H,H,x,S,x,N,S,H,H,H,H,H,H,H,H,H,H,H,H,H,H,S,S,S,x,N,E,E,L,L,L,E,E,E,E,E,k,C,k,C,C,b,b,b,b,b,b,b,b,b,b,C,E,E,E,E,E,E,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,E,E,E,E,E,E,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,E,E,E,E,H,H,H,H,H,H,S,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,C,E,L,L,L,L,E,E,E,E,g,E,E,H,E,E,L,L,b,b,E,g,E,E,E,b,g,E,E,E,E,E],j=[N,N,N,N,N,N,N,N,N,N,N,H,H,H,g,y,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,N,S,O,M,_,D,P,C,L,L,L,L,L,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,C,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,N];t.L=g,t.R=y,t.EN=b,t.ON_R=3,t.AN=4,t.R_H=5,t.B=6,t.RLE=7,t.DOT="\u00b7",t.doBidiReorder=function(e,n,r){if(e.length<2)return{};var i=e.split(""),o=new Array(i.length),u=new Array(i.length),a=[];s=r?m:v,F(i,a,i.length,n);for(var f=0;fT&&n[f]0&&i[f-1]==="\u0644"&&/\u0622|\u0623|\u0625|\u0627/.test(i[f])&&(a[f-1]=a[f]=t.R_H,f++);i[i.length-1]===t.DOT&&(a[i.length-1]=t.B),i[0]==="\u202b"&&(a[0]=t.RLE);for(var f=0;f=0&&(e=this.session.$docRowCache[n])}return e},this.getSplitIndex=function(){var e=0,t=this.session.$screenRowCache;if(t.length){var n,r=this.session.$getRowCacheIndex(t,this.currentRow);while(this.currentRow-e>0){n=this.session.$getRowCacheIndex(t,this.currentRow-e-1);if(n!==r)break;r=n,e++}}else e=this.currentRow;return e},this.updateRowLine=function(e,t){e===undefined&&(e=this.getDocumentRow());var n=e===this.session.getLength()-1,s=n?this.EOF:this.EOL;this.wrapIndent=0,this.line=this.session.getLine(e),this.isRtlDir=this.$isRtl||this.line.charAt(0)===this.RLE;if(this.session.$useWrapMode){var o=this.session.$wrapData[e];o&&(t===undefined&&(t=this.getSplitIndex()),t>0&&o.length?(this.wrapIndent=o.indent,this.wrapOffset=this.wrapIndent*this.charWidths[r.L],this.line=tt?this.session.getOverwrite()?e:e-1:t,i=r.getVisualFromLogicalIdx(n,this.bidiMap),s=this.bidiMap.bidiLevels,o=0;!this.session.getOverwrite()&&e<=t&&s[i]%2!==0&&i++;for(var u=0;ut&&s[i]%2===0&&(o+=this.charWidths[s[i]]),this.wrapIndent&&(o+=this.isRtlDir?-1*this.wrapOffset:this.wrapOffset),this.isRtlDir&&(o+=this.rtlLineOffset),o},this.getSelections=function(e,t){var n=this.bidiMap,r=n.bidiLevels,i,s=[],o=0,u=Math.min(e,t)-this.wrapIndent,a=Math.max(e,t)-this.wrapIndent,f=!1,l=!1,c=0;this.wrapIndent&&(o+=this.isRtlDir?-1*this.wrapOffset:this.wrapOffset);for(var h,p=0;p=u&&hn+s/2){n+=s;if(r===i.length-1){s=0;break}s=this.charWidths[i[++r]]}return r>0&&i[r-1]%2!==0&&i[r]%2===0?(e0&&i[r-1]%2===0&&i[r]%2!==0?t=1+(e>n?this.bidiMap.logicalFromVisual[r]:this.bidiMap.logicalFromVisual[r-1]):this.isRtlDir&&r===i.length-1&&s===0&&i[r-1]%2===0||!this.isRtlDir&&r===0&&i[r]%2!==0?t=1+this.bidiMap.logicalFromVisual[r]:(r>0&&i[r-1]%2!==0&&s!==0&&r--,t=this.bidiMap.logicalFromVisual[r]),t===0&&this.isRtlDir&&t++,t+this.wrapIndent}}).call(o.prototype),t.BidiHandler=o}),ace.define("ace/selection",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/range"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/lang"),s=e("./lib/event_emitter").EventEmitter,o=e("./range").Range,u=function(e){this.session=e,this.doc=e.getDocument(),this.clearSelection(),this.cursor=this.lead=this.doc.createAnchor(0,0),this.anchor=this.doc.createAnchor(0,0),this.$silent=!1;var t=this;this.cursor.on("change",function(e){t.$cursorChanged=!0,t.$silent||t._emit("changeCursor"),!t.$isEmpty&&!t.$silent&&t._emit("changeSelection"),!t.$keepDesiredColumnOnChange&&e.old.column!=e.value.column&&(t.$desiredColumn=null)}),this.anchor.on("change",function(){t.$anchorChanged=!0,!t.$isEmpty&&!t.$silent&&t._emit("changeSelection")})};(function(){r.implement(this,s),this.isEmpty=function(){return this.$isEmpty||this.anchor.row==this.lead.row&&this.anchor.column==this.lead.column},this.isMultiLine=function(){return!this.$isEmpty&&this.anchor.row!=this.cursor.row},this.getCursor=function(){return this.lead.getPosition()},this.setSelectionAnchor=function(e,t){this.$isEmpty=!1,this.anchor.setPosition(e,t)},this.getAnchor=this.getSelectionAnchor=function(){return this.$isEmpty?this.getSelectionLead():this.anchor.getPosition()},this.getSelectionLead=function(){return this.lead.getPosition()},this.isBackwards=function(){var e=this.anchor,t=this.lead;return e.row>t.row||e.row==t.row&&e.column>t.column},this.getRange=function(){var e=this.anchor,t=this.lead;return this.$isEmpty?o.fromPoints(t,t):this.isBackwards()?o.fromPoints(t,e):o.fromPoints(e,t)},this.clearSelection=function(){this.$isEmpty||(this.$isEmpty=!0,this._emit("changeSelection"))},this.selectAll=function(){this.$setSelection(0,0,Number.MAX_VALUE,Number.MAX_VALUE)},this.setRange=this.setSelectionRange=function(e,t){var n=t?e.end:e.start,r=t?e.start:e.end;this.$setSelection(n.row,n.column,r.row,r.column)},this.$setSelection=function(e,t,n,r){var i=this.$isEmpty,s=this.inMultiSelectMode;this.$silent=!0,this.$cursorChanged=this.$anchorChanged=!1,this.anchor.setPosition(e,t),this.cursor.setPosition(n,r),this.$isEmpty=!o.comparePoints(this.anchor,this.cursor),this.$silent=!1,this.$cursorChanged&&this._emit("changeCursor"),(this.$cursorChanged||this.$anchorChanged||i!=this.$isEmpty||s)&&this._emit("changeSelection")},this.$moveSelection=function(e){var t=this.lead;this.$isEmpty&&this.setSelectionAnchor(t.row,t.column),e.call(this)},this.selectTo=function(e,t){this.$moveSelection(function(){this.moveCursorTo(e,t)})},this.selectToPosition=function(e){this.$moveSelection(function(){this.moveCursorToPosition(e)})},this.moveTo=function(e,t){this.clearSelection(),this.moveCursorTo(e,t)},this.moveToPosition=function(e){this.clearSelection(),this.moveCursorToPosition(e)},this.selectUp=function(){this.$moveSelection(this.moveCursorUp)},this.selectDown=function(){this.$moveSelection(this.moveCursorDown)},this.selectRight=function(){this.$moveSelection(this.moveCursorRight)},this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)},this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)},this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)},this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)},this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)},this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)},this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)},this.getWordRange=function(e,t){if(typeof t=="undefined"){var n=e||this.lead;e=n.row,t=n.column}return this.session.getWordRange(e,t)},this.selectWord=function(){this.setSelectionRange(this.getWordRange())},this.selectAWord=function(){var e=this.getCursor(),t=this.session.getAWordRange(e.row,e.column);this.setSelectionRange(t)},this.getLineRange=function(e,t){var n=typeof e=="number"?e:this.lead.row,r,i=this.session.getFoldLine(n);return i?(n=i.start.row,r=i.end.row):r=n,t===!0?new o(n,0,r,this.session.getLine(r).length):new o(n,0,r+1,0)},this.selectLine=function(){this.setSelectionRange(this.getLineRange())},this.moveCursorUp=function(){this.moveCursorBy(-1,0)},this.moveCursorDown=function(){this.moveCursorBy(1,0)},this.wouldMoveIntoSoftTab=function(e,t,n){var r=e.column,i=e.column+t;return n<0&&(r=e.column-t,i=e.column),this.session.isTabStop(e)&&this.doc.getLine(e.row).slice(r,i).split(" ").length-1==t},this.moveCursorLeft=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,-1))this.moveCursorTo(t.start.row,t.start.column);else if(e.column===0)e.row>0&&this.moveCursorTo(e.row-1,this.doc.getLine(e.row-1).length);else{var n=this.session.getTabSize();this.wouldMoveIntoSoftTab(e,n,-1)&&!this.session.getNavigateWithinSoftTabs()?this.moveCursorBy(0,-n):this.moveCursorBy(0,-1)}},this.moveCursorRight=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,1))this.moveCursorTo(t.end.row,t.end.column);else if(this.lead.column==this.doc.getLine(this.lead.row).length)this.lead.row0&&(t.column=r)}}this.moveCursorTo(t.row,t.column)},this.moveCursorFileEnd=function(){var e=this.doc.getLength()-1,t=this.doc.getLine(e).length;this.moveCursorTo(e,t)},this.moveCursorFileStart=function(){this.moveCursorTo(0,0)},this.moveCursorLongWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t);this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;var i=this.session.getFoldAt(e,t,1);if(i){this.moveCursorTo(i.end.row,i.end.column);return}this.session.nonTokenRe.exec(r)&&(t+=this.session.nonTokenRe.lastIndex,this.session.nonTokenRe.lastIndex=0,r=n.substring(t));if(t>=n.length){this.moveCursorTo(e,n.length),this.moveCursorRight(),e0&&this.moveCursorWordLeft();return}this.session.tokenRe.exec(s)&&(t-=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0),this.moveCursorTo(e,t)},this.$shortWordEndIndex=function(e){var t=0,n,r=/\s/,i=this.session.tokenRe;i.lastIndex=0;if(this.session.tokenRe.exec(e))t=this.session.tokenRe.lastIndex;else{while((n=e[t])&&r.test(n))t++;if(t<1){i.lastIndex=0;while((n=e[t])&&!i.test(n)){i.lastIndex=0,t++;if(r.test(n)){if(t>2){t--;break}while((n=e[t])&&r.test(n))t++;if(t>2)break}}}}return i.lastIndex=0,t},this.moveCursorShortWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t),i=this.session.getFoldAt(e,t,1);if(i)return this.moveCursorTo(i.end.row,i.end.column);if(t==n.length){var s=this.doc.getLength();do e++,r=this.doc.getLine(e);while(e0&&/^\s*$/.test(r));t=r.length,/\s+$/.test(r)||(r="")}var s=i.stringReverse(r),o=this.$shortWordEndIndex(s);return this.moveCursorTo(e,t-o)},this.moveCursorWordRight=function(){this.session.$selectLongWords?this.moveCursorLongWordRight():this.moveCursorShortWordRight()},this.moveCursorWordLeft=function(){this.session.$selectLongWords?this.moveCursorLongWordLeft():this.moveCursorShortWordLeft()},this.moveCursorBy=function(e,t){var n=this.session.documentToScreenPosition(this.lead.row,this.lead.column),r;t===0&&(e!==0&&(this.session.$bidiHandler.isBidiRow(n.row,this.lead.row)?(r=this.session.$bidiHandler.getPosLeft(n.column),n.column=Math.round(r/this.session.$bidiHandler.charWidths[0])):r=n.column*this.session.$bidiHandler.charWidths[0]),this.$desiredColumn?n.column=this.$desiredColumn:this.$desiredColumn=n.column);var i=this.session.screenToDocumentPosition(n.row+e,n.column,r);e!==0&&t===0&&i.row===this.lead.row&&i.column===this.lead.column&&this.session.lineWidgets&&this.session.lineWidgets[i.row]&&(i.row>0||e>0)&&i.row++,this.moveCursorTo(i.row,i.column+t,t===0)},this.moveCursorToPosition=function(e){this.moveCursorTo(e.row,e.column)},this.moveCursorTo=function(e,t,n){var r=this.session.getFoldAt(e,t,1);r&&(e=r.start.row,t=r.start.column),this.$keepDesiredColumnOnChange=!0;var i=this.session.getLine(e);/[\uDC00-\uDFFF]/.test(i.charAt(t))&&i.charAt(t-1)&&(this.lead.row==e&&this.lead.column==t+1?t-=1:t+=1),this.lead.setPosition(e,t),this.$keepDesiredColumnOnChange=!1,n||(this.$desiredColumn=null)},this.moveCursorToScreen=function(e,t,n){var r=this.session.screenToDocumentPosition(e,t);this.moveCursorTo(r.row,r.column,n)},this.detach=function(){this.lead.detach(),this.anchor.detach(),this.session=this.doc=null},this.fromOrientedRange=function(e){this.setSelectionRange(e,e.cursor==e.start),this.$desiredColumn=e.desiredColumn||this.$desiredColumn},this.toOrientedRange=function(e){var t=this.getRange();return e?(e.start.column=t.start.column,e.start.row=t.start.row,e.end.column=t.end.column,e.end.row=t.end.row):e=t,e.cursor=this.isBackwards()?e.start:e.end,e.desiredColumn=this.$desiredColumn,e},this.getRangeOfMovements=function(e){var t=this.getCursor();try{e(this);var n=this.getCursor();return o.fromPoints(t,n)}catch(r){return o.fromPoints(t,t)}finally{this.moveCursorToPosition(t)}},this.toJSON=function(){if(this.rangeCount)var e=this.ranges.map(function(e){var t=e.clone();return t.isBackwards=e.cursor==e.start,t});else{var e=this.getRange();e.isBackwards=this.isBackwards()}return e},this.fromJSON=function(e){if(e.start==undefined){if(this.rangeList&&e.length>1){this.toSingleRange(e[0]);for(var t=e.length;t--;){var n=o.fromPoints(e[t].start,e[t].end);e[t].isBackwards&&(n.cursor=n.start),this.addRange(n,!0)}return}e=e[0]}this.rangeList&&this.toSingleRange(e),this.setSelectionRange(e,e.isBackwards)},this.isEqual=function(e){if((e.length||this.rangeCount)&&e.length!=this.rangeCount)return!1;if(!e.length||!this.ranges)return this.getRange().isEqual(e);for(var t=this.ranges.length;t--;)if(!this.ranges[t].isEqual(e[t]))return!1;return!0}}).call(u.prototype),t.Selection=u}),ace.define("ace/tokenizer",["require","exports","module","ace/config"],function(e,t,n){"use strict";var r=e("./config"),i=2e3,s=function(e){this.states=e,this.regExps={},this.matchMappings={};for(var t in this.states){var n=this.states[t],r=[],i=0,s=this.matchMappings[t]={defaultToken:"text"},o="g",u=[];for(var a=0;a1?f.onMatch=this.$applyToken:f.onMatch=f.token),c>1&&(/\\\d/.test(f.regex)?l=f.regex.replace(/\\([0-9]+)/g,function(e,t){return"\\"+(parseInt(t,10)+i+1)}):(c=1,l=this.removeCapturingGroups(f.regex)),!f.splitRegex&&typeof f.token!="string"&&u.push(f)),s[i]=a,i+=c,r.push(l),f.onMatch||(f.onMatch=null)}r.length||(s[0]=0,r.push("$")),u.forEach(function(e){e.splitRegex=this.createSplitterRegexp(e.regex,o)},this),this.regExps[t]=new RegExp("("+r.join(")|(")+")|($)",o)}};(function(){this.$setMaxTokenCount=function(e){i=e|0},this.$applyToken=function(e){var t=this.splitRegex.exec(e).slice(1),n=this.token.apply(this,t);if(typeof n=="string")return[{type:n,value:e}];var r=[];for(var i=0,s=n.length;il){var g=e.substring(l,m-v.length);h.type==p?h.value+=g:(h.type&&f.push(h),h={type:p,value:g})}for(var y=0;yi){c>2*e.length&&this.reportError("infinite loop with in ace tokenizer",{startState:t,line:e});while(l1&&n[0]!==r&&n.unshift("#tmp",r),{tokens:f,state:n.length?n:r}},this.reportError=r.reportError}).call(s.prototype),t.Tokenizer=s}),ace.define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../lib/lang"),i=function(){this.$rules={start:[{token:"empty_line",regex:"^$"},{defaultToken:"text"}]}};(function(){this.addRules=function(e,t){if(!t){for(var n in e)this.$rules[n]=e[n];return}for(var n in e){var r=e[n];for(var i=0;i=this.$rowTokens.length){this.$row+=1,e||(e=this.$session.getLength());if(this.$row>=e)return this.$row=e-1,null;this.$rowTokens=this.$session.getTokens(this.$row),this.$tokenIndex=0}return this.$rowTokens[this.$tokenIndex]},this.getCurrentToken=function(){return this.$rowTokens[this.$tokenIndex]},this.getCurrentTokenRow=function(){return this.$row},this.getCurrentTokenColumn=function(){var e=this.$rowTokens,t=this.$tokenIndex,n=e[t].start;if(n!==undefined)return n;n=0;while(t>0)t-=1,n+=e[t].value.length;return n},this.getCurrentTokenPosition=function(){return{row:this.$row,column:this.getCurrentTokenColumn()}},this.getCurrentTokenRange=function(){var e=this.$rowTokens[this.$tokenIndex],t=this.getCurrentTokenColumn();return new r(this.$row,t,this.$row,t+e.value.length)}}).call(i.prototype),t.TokenIterator=i}),ace.define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),u=["text","paren.rparen","punctuation.operator"],a=["text","paren.rparen","punctuation.operator","comment"],f,l={},c={'"':'"',"'":"'"},h=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""}},p=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},d=function(e){this.add("braces","insertion",function(t,n,r,i,s){var u=r.getCursorPosition(),a=i.doc.getLine(u.row);if(s=="{"){h(r);var l=r.getSelectionRange(),c=i.doc.getTextRange(l);if(c!==""&&c!=="{"&&r.getWrapBehavioursEnabled())return p(l,c,"{","}");if(d.isSaneInsertion(r,i))return/[\]\}\)]/.test(a[u.column])||r.inMultiSelectMode||e&&e.braces?(d.recordAutoInsert(r,i,"}"),{text:"{}",selection:[1,1]}):(d.recordMaybeInsert(r,i,"{"),{text:"{",selection:[1,1]})}else if(s=="}"){h(r);var v=a.substring(u.column,u.column+1);if(v=="}"){var m=i.$findOpeningBracket("}",{column:u.column+1,row:u.row});if(m!==null&&d.isAutoInsertedClosing(u,a,s))return d.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else{if(s=="\n"||s=="\r\n"){h(r);var g="";d.isMaybeInsertedClosing(u,a)&&(g=o.stringRepeat("}",f.maybeInsertedBrackets),d.clearMaybeInsertedClosing());var v=a.substring(u.column,u.column+1);if(v==="}"){var y=i.findMatchingBracket({row:u.row,column:u.column+1},"}");if(!y)return null;var b=this.$getIndent(i.getLine(y.row))}else{if(!g){d.clearMaybeInsertedClosing();return}var b=this.$getIndent(a)}var w=b+i.getTabString();return{text:"\n"+w+"\n"+b+g,selection:[1,w.length,1,w.length]}}d.clearMaybeInsertedClosing()}}),this.add("braces","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="{"){h(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u=="}")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add("parens","insertion",function(e,t,n,r,i){if(i=="("){h(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return p(s,o,"(",")");if(d.isSaneInsertion(n,r))return d.recordAutoInsert(n,r,")"),{text:"()",selection:[1,1]}}else if(i==")"){h(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==")"){var l=r.$findOpeningBracket(")",{column:u.column+1,row:u.row});if(l!==null&&d.isAutoInsertedClosing(u,a,i))return d.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="("){h(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==")")return i.end.column++,i}}),this.add("brackets","insertion",function(e,t,n,r,i){if(i=="["){h(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return p(s,o,"[","]");if(d.isSaneInsertion(n,r))return d.recordAutoInsert(n,r,"]"),{text:"[]",selection:[1,1]}}else if(i=="]"){h(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f=="]"){var l=r.$findOpeningBracket("]",{column:u.column+1,row:u.row});if(l!==null&&d.isAutoInsertedClosing(u,a,i))return d.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("brackets","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="["){h(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u=="]")return i.end.column++,i}}),this.add("string_dquotes","insertion",function(e,t,n,r,i){var s=r.$mode.$quotes||c;if(i.length==1&&s[i]){if(this.lineCommentStart&&this.lineCommentStart.indexOf(i)!=-1)return;h(n);var o=i,u=n.getSelectionRange(),a=r.doc.getTextRange(u);if(a!==""&&(a.length!=1||!s[a])&&n.getWrapBehavioursEnabled())return p(u,a,o,o);if(!a){var f=n.getCursorPosition(),l=r.doc.getLine(f.row),d=l.substring(f.column-1,f.column),v=l.substring(f.column,f.column+1),m=r.getTokenAt(f.row,f.column),g=r.getTokenAt(f.row,f.column+1);if(d=="\\"&&m&&/escape/.test(m.type))return null;var y=m&&/string|escape/.test(m.type),b=!g||/string|escape/.test(g.type),w;if(v==o)w=y!==b,w&&/string\.end/.test(g.type)&&(w=!1);else{if(y&&!b)return null;if(y&&b)return null;var E=r.$mode.tokenRe;E.lastIndex=0;var S=E.test(d);E.lastIndex=0;var x=E.test(d);if(S||x)return null;if(v&&!/[\s;,.})\]\\]/.test(v))return null;w=!0}return{text:w?o+o:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.$mode.$quotes||c,o=r.doc.getTextRange(i);if(!i.isMultiLine()&&s.hasOwnProperty(o)){h(n);var u=r.doc.getLine(i.start.row),a=u.substring(i.start.column+1,i.start.column+2);if(a==o)return i.end.column++,i}})};d.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||"text",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||"text",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||"text",a)},d.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},d.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},d.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},d.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},d.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},d.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},d.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(d,i),t.CstyleBehaviour=d}),ace.define("ace/unicode",["require","exports","module"],function(e,t,n){"use strict";var r=[48,9,8,25,5,0,2,25,48,0,11,0,5,0,6,22,2,30,2,457,5,11,15,4,8,0,2,0,18,116,2,1,3,3,9,0,2,2,2,0,2,19,2,82,2,138,2,4,3,155,12,37,3,0,8,38,10,44,2,0,2,1,2,1,2,0,9,26,6,2,30,10,7,61,2,9,5,101,2,7,3,9,2,18,3,0,17,58,3,100,15,53,5,0,6,45,211,57,3,18,2,5,3,11,3,9,2,1,7,6,2,2,2,7,3,1,3,21,2,6,2,0,4,3,3,8,3,1,3,3,9,0,5,1,2,4,3,11,16,2,2,5,5,1,3,21,2,6,2,1,2,1,2,1,3,0,2,4,5,1,3,2,4,0,8,3,2,0,8,15,12,2,2,8,2,2,2,21,2,6,2,1,2,4,3,9,2,2,2,2,3,0,16,3,3,9,18,2,2,7,3,1,3,21,2,6,2,1,2,4,3,8,3,1,3,2,9,1,5,1,2,4,3,9,2,0,17,1,2,5,4,2,2,3,4,1,2,0,2,1,4,1,4,2,4,11,5,4,4,2,2,3,3,0,7,0,15,9,18,2,2,7,2,2,2,22,2,9,2,4,4,7,2,2,2,3,8,1,2,1,7,3,3,9,19,1,2,7,2,2,2,22,2,9,2,4,3,8,2,2,2,3,8,1,8,0,2,3,3,9,19,1,2,7,2,2,2,22,2,15,4,7,2,2,2,3,10,0,9,3,3,9,11,5,3,1,2,17,4,23,2,8,2,0,3,6,4,0,5,5,2,0,2,7,19,1,14,57,6,14,2,9,40,1,2,0,3,1,2,0,3,0,7,3,2,6,2,2,2,0,2,0,3,1,2,12,2,2,3,4,2,0,2,5,3,9,3,1,35,0,24,1,7,9,12,0,2,0,2,0,5,9,2,35,5,19,2,5,5,7,2,35,10,0,58,73,7,77,3,37,11,42,2,0,4,328,2,3,3,6,2,0,2,3,3,40,2,3,3,32,2,3,3,6,2,0,2,3,3,14,2,56,2,3,3,66,5,0,33,15,17,84,13,619,3,16,2,25,6,74,22,12,2,6,12,20,12,19,13,12,2,2,2,1,13,51,3,29,4,0,5,1,3,9,34,2,3,9,7,87,9,42,6,69,11,28,4,11,5,11,11,39,3,4,12,43,5,25,7,10,38,27,5,62,2,28,3,10,7,9,14,0,89,75,5,9,18,8,13,42,4,11,71,55,9,9,4,48,83,2,2,30,14,230,23,280,3,5,3,37,3,5,3,7,2,0,2,0,2,0,2,30,3,52,2,6,2,0,4,2,2,6,4,3,3,5,5,12,6,2,2,6,67,1,20,0,29,0,14,0,17,4,60,12,5,0,4,11,18,0,5,0,3,9,2,0,4,4,7,0,2,0,2,0,2,3,2,10,3,3,6,4,5,0,53,1,2684,46,2,46,2,132,7,6,15,37,11,53,10,0,17,22,10,6,2,6,2,6,2,6,2,6,2,6,2,6,2,6,2,31,48,0,470,1,36,5,2,4,6,1,5,85,3,1,3,2,2,89,2,3,6,40,4,93,18,23,57,15,513,6581,75,20939,53,1164,68,45,3,268,4,27,21,31,3,13,13,1,2,24,9,69,11,1,38,8,3,102,3,1,111,44,25,51,13,68,12,9,7,23,4,0,5,45,3,35,13,28,4,64,15,10,39,54,10,13,3,9,7,22,4,1,5,66,25,2,227,42,2,1,3,9,7,11171,13,22,5,48,8453,301,3,61,3,105,39,6,13,4,6,11,2,12,2,4,2,0,2,1,2,1,2,107,34,362,19,63,3,53,41,11,5,15,17,6,13,1,25,2,33,4,2,134,20,9,8,25,5,0,2,25,12,88,4,5,3,5,3,5,3,2],i=0,s=[];for(var o=0;o2?r%f!=f-1:r%f==0}}var E=Infinity;w(function(e,t){var n=e.search(/\S/);n!==-1?(ne.length&&(E=e.length)}),u==Infinity&&(u=E,s=!1,o=!1),l&&u%f!=0&&(u=Math.floor(u/f)*f),w(o?m:v)},this.toggleBlockComment=function(e,t,n,r){var i=this.blockComment;if(!i)return;!i.start&&i[0]&&(i=i[0]);var s=new f(t,r.row,r.column),o=s.getCurrentToken(),u=t.selection,a=t.selection.toOrientedRange(),c,h;if(o&&/comment/.test(o.type)){var p,d;while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.start);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;p=new l(m,g,m,g+i.start.length);break}o=s.stepBackward()}var s=new f(t,r.row,r.column),o=s.getCurrentToken();while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.end);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;d=new l(m,g,m,g+i.end.length);break}o=s.stepForward()}d&&t.remove(d),p&&(t.remove(p),c=p.start.row,h=-i.start.length)}else h=i.start.length,c=n.start.row,t.insert(n.end,i.end),t.insert(n.start,i.start);a.start.row==c&&(a.start.column+=h),a.end.row==c&&(a.end.column+=h),t.selection.fromOrientedRange(a)},this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.autoOutdent=function(e,t,n){},this.$getIndent=function(e){return e.match(/^\s*/)[0]},this.createWorker=function(e){return null},this.createModeDelegates=function(e){this.$embeds=[],this.$modes={};for(var t in e)if(e[t]){var n=e[t],i=n.prototype.$id,s=r.$modes[i];s||(r.$modes[i]=s=new n),r.$modes[t]||(r.$modes[t]=s),this.$embeds.push(t),this.$modes[t]=s}var o=["toggleBlockComment","toggleCommentLines","getNextLineIndent","checkOutdent","autoOutdent","transformAction","getCompletions"];for(var t=0;t=0&&t.row=0&&t.column<=e[t.row].length}function s(e,t){t.action!="insert"&&t.action!="remove"&&r(t,"delta.action must be 'insert' or 'remove'"),t.lines instanceof Array||r(t,"delta.lines must be an Array"),(!t.start||!t.end)&&r(t,"delta.start/end must be an present");var n=t.start;i(e,t.start)||r(t,"delta.start must be contained in document");var s=t.end;t.action=="remove"&&!i(e,s)&&r(t,"delta.end must contained in document for 'remove' actions");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,"delta.range must match delta lines")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||"";switch(t.action){case"insert":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case"remove":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),ace.define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/event_emitter").EventEmitter,s=t.Anchor=function(e,t,n){this.$onChange=this.onChange.bind(this),this.attach(e),typeof n=="undefined"?this.setPosition(t.row,t.column):this.setPosition(t,n)};(function(){function e(e,t,n){var r=n?e.column<=t.column:e.columnthis.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal("change",{old:i,value:r})},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on("change",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./apply_delta").applyDelta,s=e("./lib/event_emitter").EventEmitter,o=e("./range").Range,u=e("./anchor").Anchor,a=function(e){this.$lines=[""],e.length===0?this.$lines=[""]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},"aaa".split(/a/).length===0?this.$split=function(e){return e.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(e){return e.split(/\r\n|\r|\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\r\n|\r|\n)/m);this.$autoNewLine=t?t[1]:"\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine||"\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal("changeNewLineMode")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e=="\r\n"||e=="\r"||e=="\n"},this.getLine=function(e){return this.$lines[e]||""},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||"").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."),this.insertMergedLines(e,["",""])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:"insert",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e0,r=t=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:"remove",lines:["",""]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action=="insert";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4?this.$splitAndapplyLargeDelta(e,2e4):(i(this.$lines,e,t),this._signal("change",e))},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,r=n.length-t+1,i=e.start.row,s=e.start.column;for(var o=0,u=0;o20){n.running=setTimeout(n.$worker,20);break}}n.currentLine=t,r==-1&&(r=t),s<=r&&n.fireUpdateEvent(s,r)}};(function(){r.implement(this,i),this.setTokenizer=function(e){this.tokenizer=e,this.lines=[],this.states=[],this.start(0)},this.setDocument=function(e){this.doc=e,this.lines=[],this.states=[],this.stop()},this.fireUpdateEvent=function(e,t){var n={first:e,last:t};this._signal("update",{data:n})},this.start=function(e){this.currentLine=Math.min(e||0,this.currentLine,this.doc.getLength()),this.lines.splice(this.currentLine,this.lines.length),this.states.splice(this.currentLine,this.states.length),this.stop(),this.running=setTimeout(this.$worker,700)},this.scheduleStart=function(){this.running||(this.running=setTimeout(this.$worker,700))},this.$updateOnChange=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.lines[t]=null;else if(e.action=="remove")this.lines.splice(t,n+1,null),this.states.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.lines.splice.apply(this.lines,r),this.states.splice.apply(this.states,r)}this.currentLine=Math.min(t,this.currentLine,this.doc.getLength()),this.stop()},this.stop=function(){this.running&&clearTimeout(this.running),this.running=!1},this.getTokens=function(e){return this.lines[e]||this.$tokenizeRow(e)},this.getState=function(e){return this.currentLine==e&&this.$tokenizeRow(e),this.states[e]||"start"},this.$tokenizeRow=function(e){var t=this.doc.getLine(e),n=this.states[e-1],r=this.tokenizer.getLineTokens(t,n,e);return this.states[e]+""!=r.state+""?(this.states[e]=r.state,this.lines[e+1]=null,this.currentLine>e+1&&(this.currentLine=e+1)):this.currentLine==e&&(this.currentLine=e+1),this.lines[e]=r.tokens}}).call(s.prototype),t.BackgroundTokenizer=s}),ace.define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){"use strict";var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(e,t,n){this.setRegexp(e),this.clazz=t,this.type=n||"text"};(function(){this.MAX_RANGES=500,this.setRegexp=function(e){if(this.regExp+""==e+"")return;this.regExp=e,this.cache=[]},this.update=function(e,t,n,i){if(!this.regExp)return;var o=i.firstRow,u=i.lastRow;for(var a=o;a<=u;a++){var f=this.cache[a];f==null&&(f=r.getMatchOffsets(n.getLine(a),this.regExp),f.length>this.MAX_RANGES&&(f=f.slice(0,this.MAX_RANGES)),f=f.map(function(e){return new s(a,e.offset,a,e.offset+e.length)}),this.cache[a]=f.length?f:"");for(var l=f.length;l--;)t.drawSingleLineMarker(e,f[l].toScreenRange(n),this.clazz,i)}}}).call(o.prototype),t.SearchHighlight=o}),ace.define("ace/edit_session/fold_line",["require","exports","module","ace/range"],function(e,t,n){"use strict";function i(e,t){this.foldData=e,Array.isArray(t)?this.folds=t:t=this.folds=[t];var n=t[t.length-1];this.range=new r(t[0].start.row,t[0].start.column,n.end.row,n.end.column),this.start=this.range.start,this.end=this.range.end,this.folds.forEach(function(e){e.setFoldLine(this)},this)}var r=e("../range").Range;(function(){this.shiftRow=function(e){this.start.row+=e,this.end.row+=e,this.folds.forEach(function(t){t.start.row+=e,t.end.row+=e})},this.addFold=function(e){if(e.sameRow){if(e.start.rowthis.endRow)throw new Error("Can't add a fold to this FoldLine as it has no connection");this.folds.push(e),this.folds.sort(function(e,t){return-e.range.compareEnd(t.start.row,t.start.column)}),this.range.compareEnd(e.start.row,e.start.column)>0?(this.end.row=e.end.row,this.end.column=e.end.column):this.range.compareStart(e.end.row,e.end.column)<0&&(this.start.row=e.start.row,this.start.column=e.start.column)}else if(e.start.row==this.end.row)this.folds.push(e),this.end.row=e.end.row,this.end.column=e.end.column;else{if(e.end.row!=this.start.row)throw new Error("Trying to add fold to FoldRow that doesn't have a matching row");this.folds.unshift(e),this.start.row=e.start.row,this.start.column=e.start.column}e.foldLine=this},this.containsRow=function(e){return e>=this.start.row&&e<=this.end.row},this.walk=function(e,t,n){var r=0,i=this.folds,s,o,u,a=!0;t==null&&(t=this.end.row,n=this.end.column);for(var f=0;f0)continue;var a=i(e,o.start);return u===0?t&&a!==0?-s-2:s:a>0||a===0&&!t?s:-s-1}return-s-1},this.add=function(e){var t=!e.isEmpty(),n=this.pointIndex(e.start,t);n<0&&(n=-n-1);var r=this.pointIndex(e.end,t,n);return r<0?r=-r-1:r++,this.ranges.splice(n,r-n,e)},this.addList=function(e){var t=[];for(var n=e.length;n--;)t.push.apply(t,this.add(e[n]));return t},this.substractPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges.splice(t,1)},this.merge=function(){var e=[],t=this.ranges;t=t.sort(function(e,t){return i(e.start,t.start)});var n=t[0],r;for(var s=1;s=0},this.containsPoint=function(e){return this.pointIndex(e)>=0},this.rangeAtPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges[t]},this.clipRows=function(e,t){var n=this.ranges;if(n[0].start.row>t||n[n.length-1].start.row=r)break}if(e.action=="insert"){var f=i-r,l=-t.column+n.column;for(;or)break;a.start.row==r&&a.start.column>=t.column&&(a.start.column!=t.column||!this.$insertRight)&&(a.start.column+=l,a.start.row+=f);if(a.end.row==r&&a.end.column>=t.column){if(a.end.column==t.column&&this.$insertRight)continue;a.end.column==t.column&&l>0&&oa.start.column&&a.end.column==s[o+1].start.column&&(a.end.column-=l),a.end.column+=l,a.end.row+=f}}}else{var f=r-i,l=t.column-n.column;for(;oi)break;if(a.end.rowt.column)a.end.column=t.column,a.end.row=t.row}else a.end.column+=l,a.end.row+=f;else a.end.row>i&&(a.end.row+=f);if(a.start.rowt.column)a.start.column=t.column,a.start.row=t.row}else a.start.column+=l,a.start.row+=f;else a.start.row>i&&(a.start.row+=f)}}if(f!=0&&o=e)return i;if(i.end.row>e)return null}return null},this.getNextFoldLine=function(e,t){var n=this.$foldData,r=0;t&&(r=n.indexOf(t)),r==-1&&(r=0);for(r;r=e)return i}return null},this.getFoldedRowCount=function(e,t){var n=this.$foldData,r=t-e+1;for(var i=0;i=t){u=e?r-=t-u:r=0);break}o>=e&&(u>=e?r-=o-u:r-=o-e+1)}return r},this.$addFoldLine=function(e){return this.$foldData.push(e),this.$foldData.sort(function(e,t){return e.start.row-t.start.row}),e},this.addFold=function(e,t){var n=this.$foldData,r=!1,o;e instanceof s?o=e:(o=new s(t,e),o.collapseChildren=t.collapseChildren),this.$clipRangeToDocument(o.range);var u=o.start.row,a=o.start.column,f=o.end.row,l=o.end.column;if(u0&&(this.removeFolds(p),p.forEach(function(e){o.addSubFold(e)}));for(var d=0;d0&&this.foldAll(e.start.row+1,e.end.row,e.collapseChildren-1),e.subFolds=[]},this.expandFolds=function(e){e.forEach(function(e){this.expandFold(e)},this)},this.unfold=function(e,t){var n,i;e==null?(n=new r(0,0,this.getLength(),0),t=!0):typeof e=="number"?n=new r(e,0,e,this.getLine(e).length):"row"in e?n=r.fromPoints(e,e):n=e,i=this.getFoldsInRangeList(n);if(t)this.removeFolds(i);else{var s=i;while(s.length)this.expandFolds(s),s=this.getFoldsInRangeList(n)}if(i.length)return i},this.isRowFolded=function(e,t){return!!this.getFoldLine(e,t)},this.getRowFoldEnd=function(e,t){var n=this.getFoldLine(e,t);return n?n.end.row:e},this.getRowFoldStart=function(e,t){var n=this.getFoldLine(e,t);return n?n.start.row:e},this.getFoldDisplayLine=function(e,t,n,r,i){r==null&&(r=e.start.row),i==null&&(i=0),t==null&&(t=e.end.row),n==null&&(n=this.getLine(t).length);var s=this.doc,o="";return e.walk(function(e,t,n,u){if(tl)break}while(s&&a.test(s.type));s=i.stepBackward()}else s=i.getCurrentToken();return f.end.row=i.getCurrentTokenRow(),f.end.column=i.getCurrentTokenColumn()+s.value.length-2,f}},this.foldAll=function(e,t,n){n==undefined&&(n=1e5);var r=this.foldWidgets;if(!r)return;t=t||this.getLength(),e=e||0;for(var i=e;i=e){i=s.end.row;try{var o=this.addFold("...",s);o&&(o.collapseChildren=n)}catch(u){}}}},this.$foldStyles={manual:1,markbegin:1,markbeginend:1},this.$foldStyle="markbegin",this.setFoldStyle=function(e){if(!this.$foldStyles[e])throw new Error("invalid fold style: "+e+"["+Object.keys(this.$foldStyles).join(", ")+"]");if(this.$foldStyle==e)return;this.$foldStyle=e,e=="manual"&&this.unfold();var t=this.$foldMode;this.$setFolding(null),this.$setFolding(t)},this.$setFolding=function(e){if(this.$foldMode==e)return;this.$foldMode=e,this.off("change",this.$updateFoldWidgets),this.off("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets),this._signal("changeAnnotation");if(!e||this.$foldStyle=="manual"){this.foldWidgets=null;return}this.foldWidgets=[],this.getFoldWidget=e.getFoldWidget.bind(e,this,this.$foldStyle),this.getFoldWidgetRange=e.getFoldWidgetRange.bind(e,this,this.$foldStyle),this.$updateFoldWidgets=this.updateFoldWidgets.bind(this),this.$tokenizerUpdateFoldWidgets=this.tokenizerUpdateFoldWidgets.bind(this),this.on("change",this.$updateFoldWidgets),this.on("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets)},this.getParentFoldRangeData=function(e,t){var n=this.foldWidgets;if(!n||t&&n[e])return{};var r=e-1,i;while(r>=0){var s=n[r];s==null&&(s=n[r]=this.getFoldWidget(r));if(s=="start"){var o=this.getFoldWidgetRange(r);i||(i=o);if(o&&o.end.row>=e)break}r--}return{range:r!==-1&&o,firstRange:i}},this.onFoldWidgetClick=function(e,t){t=t.domEvent;var n={children:t.shiftKey,all:t.ctrlKey||t.metaKey,siblings:t.altKey},r=this.$toggleFoldWidget(e,n);if(!r){var i=t.target||t.srcElement;i&&/ace_fold-widget/.test(i.className)&&(i.className+=" ace_invalid")}},this.$toggleFoldWidget=function(e,t){if(!this.getFoldWidget)return;var n=this.getFoldWidget(e),r=this.getLine(e),i=n==="end"?-1:1,s=this.getFoldAt(e,i===-1?0:r.length,i);if(s)return t.children||t.all?this.removeFold(s):this.expandFold(s),s;var o=this.getFoldWidgetRange(e,!0);if(o&&!o.isMultiLine()){s=this.getFoldAt(o.start.row,o.start.column,1);if(s&&o.isEqual(s.range))return this.removeFold(s),s}if(t.siblings){var u=this.getParentFoldRangeData(e);if(u.range)var a=u.range.start.row+1,f=u.range.end.row;this.foldAll(a,f,t.all?1e4:0)}else t.children?(f=o?o.end.row:this.getLength(),this.foldAll(e+1,f,t.all?1e4:0)):o&&(t.all&&(o.collapseChildren=1e4),this.addFold("...",o));return o},this.toggleFoldWidget=function(e){var t=this.selection.getCursor().row;t=this.getRowFoldStart(t);var n=this.$toggleFoldWidget(t,{});if(n)return;var r=this.getParentFoldRangeData(t,!0);n=r.range||r.firstRange;if(n){t=n.start.row;var i=this.getFoldAt(t,this.getLine(t).length,1);i?this.removeFold(i):this.addFold("...",n)}},this.updateFoldWidgets=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.foldWidgets[t]=null;else if(e.action=="remove")this.foldWidgets.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.foldWidgets.splice.apply(this.foldWidgets,r)}},this.tokenizerUpdateFoldWidgets=function(e){var t=e.data;t.first!=t.last&&this.foldWidgets.length>t.first&&this.foldWidgets.splice(t.first,this.foldWidgets.length)}}var r=e("../range").Range,i=e("./fold_line").FoldLine,s=e("./fold").Fold,o=e("../token_iterator").TokenIterator;t.Folding=u}),ace.define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"],function(e,t,n){"use strict";function s(){this.findMatchingBracket=function(e,t){if(e.column==0)return null;var n=t||this.getLine(e.row).charAt(e.column-1);if(n=="")return null;var r=n.match(/([\(\[\{])|([\)\]\}])/);return r?r[1]?this.$findClosingBracket(r[1],e):this.$findOpeningBracket(r[2],e):null},this.getBracketRange=function(e){var t=this.getLine(e.row),n=!0,r,s=t.charAt(e.column-1),o=s&&s.match(/([\(\[\{])|([\)\]\}])/);o||(s=t.charAt(e.column),e={row:e.row,column:e.column+1},o=s&&s.match(/([\(\[\{])|([\)\]\}])/),n=!1);if(!o)return null;if(o[1]){var u=this.$findClosingBracket(o[1],e);if(!u)return null;r=i.fromPoints(e,u),n||(r.end.column++,r.start.column--),r.cursor=r.end}else{var u=this.$findOpeningBracket(o[2],e);if(!u)return null;r=i.fromPoints(u,e),n||(r.start.column++,r.end.column--),r.cursor=r.start}return r},this.$brackets={")":"(","(":")","]":"[","[":"]","{":"}","}":"{","<":">",">":"<"},this.$findOpeningBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("rparen",".paren").replace(/\b(?:end)\b/,"(?:start|begin|end)")+")+"));var a=t.column-o.getCurrentTokenColumn()-2,f=u.value;for(;;){while(a>=0){var l=f.charAt(a);if(l==i){s-=1;if(s==0)return{row:o.getCurrentTokenRow(),column:a+o.getCurrentTokenColumn()}}else l==e&&(s+=1);a-=1}do u=o.stepBackward();while(u&&!n.test(u.type));if(u==null)break;f=u.value,a=f.length-1}return null},this.$findClosingBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("lparen",".paren").replace(/\b(?:start|begin)\b/,"(?:start|begin|end)")+")+"));var a=t.column-o.getCurrentTokenColumn();for(;;){var f=u.value,l=f.length;while(a=4352&&e<=4447||e>=4515&&e<=4519||e>=4602&&e<=4607||e>=9001&&e<=9002||e>=11904&&e<=11929||e>=11931&&e<=12019||e>=12032&&e<=12245||e>=12272&&e<=12283||e>=12288&&e<=12350||e>=12353&&e<=12438||e>=12441&&e<=12543||e>=12549&&e<=12589||e>=12593&&e<=12686||e>=12688&&e<=12730||e>=12736&&e<=12771||e>=12784&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=13054||e>=13056&&e<=19903||e>=19968&&e<=42124||e>=42128&&e<=42182||e>=43360&&e<=43388||e>=44032&&e<=55203||e>=55216&&e<=55238||e>=55243&&e<=55291||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=65281&&e<=65376||e>=65504&&e<=65510}r.implement(this,u),this.setDocument=function(e){this.doc&&this.doc.removeListener("change",this.$onChange),this.doc=e,e.on("change",this.$onChange),this.bgTokenizer&&this.bgTokenizer.setDocument(this.getDocument()),this.resetCaches()},this.getDocument=function(){return this.doc},this.$resetRowCache=function(e){if(!e){this.$docRowCache=[],this.$screenRowCache=[];return}var t=this.$docRowCache.length,n=this.$getRowCacheIndex(this.$docRowCache,e)+1;t>n&&(this.$docRowCache.splice(n,t),this.$screenRowCache.splice(n,t))},this.$getRowCacheIndex=function(e,t){var n=0,r=e.length-1;while(n<=r){var i=n+r>>1,s=e[i];if(t>s)n=i+1;else{if(!(t=t)break}return r=n[s],r?(r.index=s,r.start=i-r.value.length,r):null},this.setUndoManager=function(e){this.$undoManager=e,this.$informUndoManager&&this.$informUndoManager.cancel();if(e){var t=this;e.addSession(this),this.$syncInformUndoManager=function(){t.$informUndoManager.cancel(),t.mergeUndoDeltas=!1},this.$informUndoManager=i.delayedCall(this.$syncInformUndoManager)}else this.$syncInformUndoManager=function(){}},this.markUndoGroup=function(){this.$syncInformUndoManager&&this.$syncInformUndoManager()},this.$defaultUndoManager={undo:function(){},redo:function(){},reset:function(){},add:function(){},addSelection:function(){},startNewGroup:function(){},addSession:function(){}},this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager},this.getTabString=function(){return this.getUseSoftTabs()?i.stringRepeat(" ",this.getTabSize()):" "},this.setUseSoftTabs=function(e){this.setOption("useSoftTabs",e)},this.getUseSoftTabs=function(){return this.$useSoftTabs&&!this.$mode.$indentWithTabs},this.setTabSize=function(e){this.setOption("tabSize",e)},this.getTabSize=function(){return this.$tabSize},this.isTabStop=function(e){return this.$useSoftTabs&&e.column%this.$tabSize===0},this.setNavigateWithinSoftTabs=function(e){this.setOption("navigateWithinSoftTabs",e)},this.getNavigateWithinSoftTabs=function(){return this.$navigateWithinSoftTabs},this.$overwrite=!1,this.setOverwrite=function(e){this.setOption("overwrite",e)},this.getOverwrite=function(){return this.$overwrite},this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)},this.addGutterDecoration=function(e,t){this.$decorations[e]||(this.$decorations[e]=""),this.$decorations[e]+=" "+t,this._signal("changeBreakpoint",{})},this.removeGutterDecoration=function(e,t){this.$decorations[e]=(this.$decorations[e]||"").replace(" "+t,""),this._signal("changeBreakpoint",{})},this.getBreakpoints=function(){return this.$breakpoints},this.setBreakpoints=function(e){this.$breakpoints=[];for(var t=0;t0&&(r=!!n.charAt(t-1).match(this.tokenRe)),r||(r=!!n.charAt(t).match(this.tokenRe));if(r)var i=this.tokenRe;else if(/^\s+$/.test(n.slice(t-1,t+1)))var i=/\s/;else var i=this.nonTokenRe;var s=t;if(s>0){do s--;while(s>=0&&n.charAt(s).match(i));s++}var o=t;while(oe&&(e=t.screenWidth)}),this.lineWidgetWidth=e},this.$computeWidth=function(e){if(this.$modified||e){this.$modified=!1;if(this.$useWrapMode)return this.screenWidth=this.$wrapLimit;var t=this.doc.getAllLines(),n=this.$rowLengthCache,r=0,i=0,s=this.$foldData[i],o=s?s.start.row:Infinity,u=t.length;for(var a=0;ao){a=s.end.row+1;if(a>=u)break;s=this.$foldData[i++],o=s?s.start.row:Infinity}n[a]==null&&(n[a]=this.$getStringScreenWidth(t[a])[0]),n[a]>r&&(r=n[a])}this.screenWidth=r}},this.getLine=function(e){return this.doc.getLine(e)},this.getLines=function(e,t){return this.doc.getLines(e,t)},this.getLength=function(){return this.doc.getLength()},this.getTextRange=function(e){return this.doc.getTextRange(e||this.selection.getRange())},this.insert=function(e,t){return this.doc.insert(e,t)},this.remove=function(e){return this.doc.remove(e)},this.removeFullLines=function(e,t){return this.doc.removeFullLines(e,t)},this.undoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;for(var n=e.length-1;n!=-1;n--){var r=e[n];r.action=="insert"||r.action=="remove"?this.doc.revertDelta(r):r.folds&&this.addFolds(r.folds)}!t&&this.$undoSelect&&(e.selectionBefore?this.selection.fromJSON(e.selectionBefore):this.selection.setRange(this.$getUndoSelection(e,!0))),this.$fromUndo=!1},this.redoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;for(var n=0;ne.end.column&&(s.start.column+=u),s.end.row==e.end.row&&s.end.column>e.end.column&&(s.end.column+=u)),o&&s.start.row>=e.end.row&&(s.start.row+=o,s.end.row+=o)}s.end=this.insert(s.start,r);if(i.length){var a=e.start,f=s.start,o=f.row-a.row,u=f.column-a.column;this.addFolds(i.map(function(e){return e=e.clone(),e.start.row==a.row&&(e.start.column+=u),e.end.row==a.row&&(e.end.column+=u),e.start.row+=o,e.end.row+=o,e}))}return s},this.indentRows=function(e,t,n){n=n.replace(/\t/g,this.getTabString());for(var r=e;r<=t;r++)this.doc.insertInLine({row:r,column:0},n)},this.outdentRows=function(e){var t=e.collapseRows(),n=new l(0,0,0,0),r=this.getTabSize();for(var i=t.start.row;i<=t.end.row;++i){var s=this.getLine(i);n.start.row=i,n.end.row=i;for(var o=0;o0){var r=this.getRowFoldEnd(t+n);if(r>this.doc.getLength()-1)return 0;var i=r-t}else{e=this.$clipRowToDocument(e),t=this.$clipRowToDocument(t);var i=t-e+1}var s=new l(e,0,t,Number.MAX_VALUE),o=this.getFoldsInRange(s).map(function(e){return e=e.clone(),e.start.row+=i,e.end.row+=i,e}),u=n==0?this.doc.getLines(e,t):this.doc.removeFullLines(e,t);return this.doc.insertFullLines(e+i,u),o.length&&this.addFolds(o),i},this.moveLinesUp=function(e,t){return this.$moveLines(e,t,-1)},this.moveLinesDown=function(e,t){return this.$moveLines(e,t,1)},this.duplicateLines=function(e,t){return this.$moveLines(e,t,0)},this.$clipRowToDocument=function(e){return Math.max(0,Math.min(e,this.doc.getLength()-1))},this.$clipColumnToRow=function(e,t){return t<0?0:Math.min(this.doc.getLine(e).length,t)},this.$clipPositionToDocument=function(e,t){t=Math.max(0,t);if(e<0)e=0,t=0;else{var n=this.doc.getLength();e>=n?(e=n-1,t=this.doc.getLine(n-1).length):t=Math.min(this.doc.getLine(e).length,t)}return{row:e,column:t}},this.$clipRangeToDocument=function(e){e.start.row<0?(e.start.row=0,e.start.column=0):e.start.column=this.$clipColumnToRow(e.start.row,e.start.column);var t=this.doc.getLength()-1;return e.end.row>t?(e.end.row=t,e.end.column=this.doc.getLine(t).length):e.end.column=this.$clipColumnToRow(e.end.row,e.end.column),e},this.$wrapLimit=80,this.$useWrapMode=!1,this.$wrapLimitRange={min:null,max:null},this.setUseWrapMode=function(e){if(e!=this.$useWrapMode){this.$useWrapMode=e,this.$modified=!0,this.$resetRowCache(0);if(e){var t=this.getLength();this.$wrapData=Array(t),this.$updateWrapData(0,t-1)}this._signal("changeWrapMode")}},this.getUseWrapMode=function(){return this.$useWrapMode},this.setWrapLimitRange=function(e,t){if(this.$wrapLimitRange.min!==e||this.$wrapLimitRange.max!==t)this.$wrapLimitRange={min:e,max:t},this.$modified=!0,this.$bidiHandler.markAsDirty(),this.$useWrapMode&&this._signal("changeWrapMode")},this.adjustWrapLimit=function(e,t){var n=this.$wrapLimitRange;n.max<0&&(n={min:t,max:t});var r=this.$constrainWrapLimit(e,n.min,n.max);return r!=this.$wrapLimit&&r>1?(this.$wrapLimit=r,this.$modified=!0,this.$useWrapMode&&(this.$updateWrapData(0,this.getLength()-1),this.$resetRowCache(0),this._signal("changeWrapLimit")),!0):!1},this.$constrainWrapLimit=function(e,t,n){return t&&(e=Math.max(t,e)),n&&(e=Math.min(n,e)),e},this.getWrapLimit=function(){return this.$wrapLimit},this.setWrapLimit=function(e){this.setWrapLimitRange(e,e)},this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}},this.$updateInternalDataOnChange=function(e){var t=this.$useWrapMode,n=e.action,r=e.start,i=e.end,s=r.row,o=i.row,u=o-s,a=null;this.$updating=!0;if(u!=0)if(n==="remove"){this[t?"$wrapData":"$rowLengthCache"].splice(s,u);var f=this.$foldData;a=this.getFoldsInRange(e),this.removeFolds(a);var l=this.getFoldLine(i.row),c=0;if(l){l.addRemoveChars(i.row,i.column,r.column-i.column),l.shiftRow(-u);var h=this.getFoldLine(s);h&&h!==l&&(h.merge(l),l=h),c=f.indexOf(l)+1}for(c;c=i.row&&l.shiftRow(-u)}o=s}else{var p=Array(u);p.unshift(s,0);var d=t?this.$wrapData:this.$rowLengthCache;d.splice.apply(d,p);var f=this.$foldData,l=this.getFoldLine(s),c=0;if(l){var v=l.range.compareInside(r.row,r.column);v==0?(l=l.split(r.row,r.column),l&&(l.shiftRow(u),l.addRemoveChars(o,0,i.column-r.column))):v==-1&&(l.addRemoveChars(s,0,i.column-r.column),l.shiftRow(u)),c=f.indexOf(l)+1}for(c;c=s&&l.shiftRow(u)}}else{u=Math.abs(e.start.column-e.end.column),n==="remove"&&(a=this.getFoldsInRange(e),this.removeFolds(a),u=-u);var l=this.getFoldLine(s);l&&l.addRemoveChars(s,r.column,u)}return t&&this.$wrapData.length!=this.doc.getLength()&&console.error("doc.getLength() and $wrapData.length have to be the same!"),this.$updating=!1,t?this.$updateWrapData(s,o):this.$updateRowLengthCache(s,o),a},this.$updateRowLengthCache=function(e,t,n){this.$rowLengthCache[e]=null,this.$rowLengthCache[t]=null},this.$updateWrapData=function(e,t){var r=this.doc.getAllLines(),i=this.getTabSize(),o=this.$wrapData,u=this.$wrapLimit,a,f,l=e;t=Math.min(t,r.length-1);while(l<=t)f=this.getFoldLine(l,f),f?(a=[],f.walk(function(e,t,i,o){var u;if(e!=null){u=this.$getDisplayTokens(e,a.length),u[0]=n;for(var f=1;fr-b){var w=f+r-b;if(e[w-1]>=c&&e[w]>=c){y(w);continue}if(e[w]==n||e[w]==s){for(w;w!=f-1;w--)if(e[w]==n)break;if(w>f){y(w);continue}w=f+r;for(w;w>2)),f-1);while(w>E&&e[w]E&&e[w]E&&e[w]==a)w--}else while(w>E&&e[w]E){y(++w);continue}w=f+r,e[w]==t&&w--,y(w-b)}return o},this.$getDisplayTokens=function(n,r){var i=[],s;r=r||0;for(var o=0;o39&&u<48||u>57&&u<64?i.push(a):u>=4352&&m(u)?i.push(e,t):i.push(e)}return i},this.$getStringScreenWidth=function(e,t,n){if(t==0)return[0,0];t==null&&(t=Infinity),n=n||0;var r,i;for(i=0;i=4352&&m(r)?n+=2:n+=1;if(n>t)break}return[n,i]},this.lineWidgets=null,this.getRowLength=function(e){if(this.lineWidgets)var t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0;else t=0;return!this.$useWrapMode||!this.$wrapData[e]?1+t:this.$wrapData[e].length+1+t},this.getRowLineCount=function(e){return!this.$useWrapMode||!this.$wrapData[e]?1:this.$wrapData[e].length+1},this.getRowWrapIndent=function(e){if(this.$useWrapMode){var t=this.screenToDocumentPosition(e,Number.MAX_VALUE),n=this.$wrapData[t.row];return n.length&&n[0]=0)var u=f[l],i=this.$docRowCache[l],h=e>f[c-1];else var h=!c;var p=this.getLength()-1,d=this.getNextFoldLine(i),v=d?d.start.row:Infinity;while(u<=e){a=this.getRowLength(i);if(u+a>e||i>=p)break;u+=a,i++,i>v&&(i=d.end.row+1,d=this.getNextFoldLine(i,d),v=d?d.start.row:Infinity),h&&(this.$docRowCache.push(i),this.$screenRowCache.push(u))}if(d&&d.start.row<=i)r=this.getFoldDisplayLine(d),i=d.start.row;else{if(u+a<=e||i>p)return{row:p,column:this.getLine(p).length};r=this.getLine(i),d=null}var m=0,g=Math.floor(e-u);if(this.$useWrapMode){var y=this.$wrapData[i];y&&(o=y[g],g>0&&y.length&&(m=y.indent,s=y[g-1]||y[y.length-1],r=r.substring(s)))}return n!==undefined&&this.$bidiHandler.isBidiRow(u+g,i,g)&&(t=this.$bidiHandler.offsetToCol(n)),s+=this.$getStringScreenWidth(r,t-m)[1],this.$useWrapMode&&s>=o&&(s=o-1),d?d.idxToPosition(s):{row:i,column:s}},this.documentToScreenPosition=function(e,t){if(typeof t=="undefined")var n=this.$clipPositionToDocument(e.row,e.column);else n=this.$clipPositionToDocument(e,t);e=n.row,t=n.column;var r=0,i=null,s=null;s=this.getFoldAt(e,t,1),s&&(e=s.start.row,t=s.start.column);var o,u=0,a=this.$docRowCache,f=this.$getRowCacheIndex(a,e),l=a.length;if(l&&f>=0)var u=a[f],r=this.$screenRowCache[f],c=e>a[l-1];else var c=!l;var h=this.getNextFoldLine(u),p=h?h.start.row:Infinity;while(u=p){o=h.end.row+1;if(o>e)break;h=this.getNextFoldLine(o,h),p=h?h.start.row:Infinity}else o=u+1;r+=this.getRowLength(u),u=o,c&&(this.$docRowCache.push(u),this.$screenRowCache.push(r))}var d="";h&&u>=p?(d=this.getFoldDisplayLine(h,e,t),i=h.start.row):(d=this.getLine(e).substring(0,t),i=e);var v=0;if(this.$useWrapMode){var m=this.$wrapData[i];if(m){var g=0;while(d.length>=m[g])r++,g++;d=d.substring(m[g-1]||0,d.length),v=g>0?m.indent:0}}return{row:r,column:v+this.$getStringScreenWidth(d)[0]}},this.documentToScreenColumn=function(e,t){return this.documentToScreenPosition(e,t).column},this.documentToScreenRow=function(e,t){return this.documentToScreenPosition(e,t).row},this.getScreenLength=function(){var e=0,t=null;if(!this.$useWrapMode){e=this.getLength();var n=this.$foldData;for(var r=0;ro&&(s=t.end.row+1,t=this.$foldData[r++],o=t?t.start.row:Infinity)}}return this.lineWidgets&&(e+=this.$getWidgetScreenLength()),e},this.$setFontMetrics=function(e){if(!this.$enableVarChar)return;this.$getStringScreenWidth=function(t,n,r){if(n===0)return[0,0];n||(n=Infinity),r=r||0;var i,s;for(s=0;sn)break}return[r,s]}},this.destroy=function(){this.bgTokenizer&&(this.bgTokenizer.setDocument(null),this.bgTokenizer=null),this.$stopWorker()},this.isFullWidth=m}.call(d.prototype),e("./edit_session/folding").Folding.call(d.prototype),e("./edit_session/bracket_match").BracketMatch.call(d.prototype),o.defineOptions(d.prototype,"session",{wrap:{set:function(e){!e||e=="off"?e=!1:e=="free"?e=!0:e=="printMargin"?e=-1:typeof e=="string"&&(e=parseInt(e,10)||!1);if(this.$wrap==e)return;this.$wrap=e;if(!e)this.setUseWrapMode(!1);else{var t=typeof e=="number"?e:null;this.setWrapLimitRange(t,t),this.setUseWrapMode(!0)}},get:function(){return this.getUseWrapMode()?this.$wrap==-1?"printMargin":this.getWrapLimitRange().min?this.$wrap:"free":"off"},handlesSet:!0},wrapMethod:{set:function(e){e=e=="auto"?this.$mode.type!="text":e!="text",e!=this.$wrapAsCode&&(this.$wrapAsCode=e,this.$useWrapMode&&(this.$useWrapMode=!1,this.setUseWrapMode(!0)))},initialValue:"auto"},indentedSoftWrap:{set:function(){this.$useWrapMode&&(this.$useWrapMode=!1,this.setUseWrapMode(!0))},initialValue:!0},firstLineNumber:{set:function(){this._signal("changeBreakpoint")},initialValue:1},useWorker:{set:function(e){this.$useWorker=e,this.$stopWorker(),e&&this.$startWorker()},initialValue:!0},useSoftTabs:{initialValue:!0},tabSize:{set:function(e){e=parseInt(e);if(isNaN(e)||this.$tabSize===e)return;this.$modified=!0,this.$rowLengthCache=[],this.$tabSize=e,this._signal("changeTabSize")},initialValue:4,handlesSet:!0},navigateWithinSoftTabs:{initialValue:!1},foldStyle:{set:function(e){this.setFoldStyle(e)},handlesSet:!0},overwrite:{set:function(e){this._signal("changeOverwrite")},initialValue:!1},newLineMode:{set:function(e){this.doc.setNewLineMode(e)},get:function(){return this.doc.getNewLineMode()},handlesSet:!0},mode:{set:function(e){this.setMode(e)},get:function(){return this.$modeId},handlesSet:!0}}),t.EditSession=d}),ace.define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){"use strict";function u(e,t){function n(e){return/\w/.test(e)||t.regExp?"\\b":""}return n(e[0])+e+n(e[e.length-1])}var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(){this.$options={}};(function(){this.set=function(e){return i.mixin(this.$options,e),this},this.getOptions=function(){return r.copyObject(this.$options)},this.setOptions=function(e){this.$options=e},this.find=function(e){var t=this.$options,n=this.$matchIterator(e,t);if(!n)return!1;var r=null;return n.forEach(function(e,n,i,o){return r=new s(e,n,i,o),n==o&&t.start&&t.start.start&&t.skipCurrent!=0&&r.isEqual(t.start)?(r=null,!1):!0}),r},this.findAll=function(e){var t=this.$options;if(!t.needle)return[];this.$assembleRegExp(t);var n=t.range,i=n?e.getLines(n.start.row,n.end.row):e.doc.getAllLines(),o=[],u=t.re;if(t.$isMultiLine){var a=u.length,f=i.length-a,l;e:for(var c=u.offset||0;c<=f;c++){for(var h=0;hv)continue;o.push(l=new s(c,v,c+a-1,m)),a>2&&(c=c+a-2)}}else for(var g=0;gE&&o[h].end.row==n.end.row)h--;o=o.slice(g,h+1);for(g=0,h=o.length;g=u;n--)if(c(n,Number.MAX_VALUE,e))return;if(t.wrap==0)return;for(n=a,u=o.row;n>=u;n--)if(c(n,Number.MAX_VALUE,e))return};else var f=function(e){var n=o.row;if(c(n,o.column,e))return;for(n+=1;n<=a;n++)if(c(n,0,e))return;if(t.wrap==0)return;for(n=u,a=o.row;n<=a;n++)if(c(n,0,e))return};if(t.$isMultiLine)var l=n.length,c=function(t,i,s){var o=r?t-l+1:t;if(o<0)return;var u=e.getLine(o),a=u.search(n[0]);if(!r&&ai)return;if(s(o,a,o+l-1,c))return!0};else if(r)var c=function(t,r,i){var s=e.getLine(t),o=[],u,a=0;n.lastIndex=0;while(u=n.exec(s)){var f=u[0].length;a=u.index;if(!f){if(a>=s.length)break;n.lastIndex=a+=1}if(u.index+f>r)break;o.push(u.index,f)}for(var l=o.length-1;l>=0;l-=2){var c=o[l-1],f=o[l];if(i(t,c,t,c+f))return!0}};else var c=function(t,r,i){var s=e.getLine(t),o,u;n.lastIndex=r;while(u=n.exec(s)){var a=u[0].length;o=u.index;if(i(t,o,t,o+a))return!0;if(!a){n.lastIndex=o+=1;if(o>=s.length)return!1}}};return{forEach:f}}}).call(o.prototype),t.Search=o}),ace.define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,n){"use strict";function o(e,t){this.platform=t||(i.isMac?"mac":"win"),this.commands={},this.commandKeyBinding={},this.addCommands(e),this.$singleCommand=!0}function u(e,t){o.call(this,e,t),this.$singleCommand=!1}var r=e("../lib/keys"),i=e("../lib/useragent"),s=r.KEY_MODS;u.prototype=o.prototype,function(){function e(e){return typeof e=="object"&&e.bindKey&&e.bindKey.position||(e.isDefault?-100:0)}this.addCommand=function(e){this.commands[e.name]&&this.removeCommand(e),this.commands[e.name]=e,e.bindKey&&this._buildKeyHash(e)},this.removeCommand=function(e,t){var n=e&&(typeof e=="string"?e:e.name);e=this.commands[n],t||delete this.commands[n];var r=this.commandKeyBinding;for(var i in r){var s=r[i];if(s==e)delete r[i];else if(Array.isArray(s)){var o=s.indexOf(e);o!=-1&&(s.splice(o,1),s.length==1&&(r[i]=s[0]))}}},this.bindKey=function(e,t,n){typeof e=="object"&&e&&(n==undefined&&(n=e.position),e=e[this.platform]);if(!e)return;if(typeof t=="function")return this.addCommand({exec:t,bindKey:e,name:t.name||e});e.split("|").forEach(function(e){var r="";if(e.indexOf(" ")!=-1){var i=e.split(/\s+/);e=i.pop(),i.forEach(function(e){var t=this.parseKeys(e),n=s[t.hashId]+t.key;r+=(r?" ":"")+n,this._addCommandToBinding(r,"chainKeys")},this),r+=" "}var o=this.parseKeys(e),u=s[o.hashId]+o.key;this._addCommandToBinding(r+u,t,n)},this)},this._addCommandToBinding=function(t,n,r){var i=this.commandKeyBinding,s;if(!n)delete i[t];else if(!i[t]||this.$singleCommand)i[t]=n;else{Array.isArray(i[t])?(s=i[t].indexOf(n))!=-1&&i[t].splice(s,1):i[t]=[i[t]],typeof r!="number"&&(r=e(n));var o=i[t];for(s=0;sr)break}o.splice(s,0,n)}},this.addCommands=function(e){e&&Object.keys(e).forEach(function(t){var n=e[t];if(!n)return;if(typeof n=="string")return this.bindKey(n,t);typeof n=="function"&&(n={exec:n});if(typeof n!="object")return;n.name||(n.name=t),this.addCommand(n)},this)},this.removeCommands=function(e){Object.keys(e).forEach(function(t){this.removeCommand(e[t])},this)},this.bindKeys=function(e){Object.keys(e).forEach(function(t){this.bindKey(t,e[t])},this)},this._buildKeyHash=function(e){this.bindKey(e.bindKey,e)},this.parseKeys=function(e){var t=e.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(e){return e}),n=t.pop(),i=r[n];if(r.FUNCTION_KEYS[i])n=r.FUNCTION_KEYS[i].toLowerCase();else{if(!t.length)return{key:n,hashId:-1};if(t.length==1&&t[0]=="shift")return{key:n.toUpperCase(),hashId:-1}}var s=0;for(var o=t.length;o--;){var u=r.KEY_MODS[t[o]];if(u==null)return typeof console!="undefined"&&console.error("invalid modifier "+t[o]+" in "+e),!1;s|=u}return{key:n,hashId:s}},this.findKeyCommand=function(t,n){var r=s[t]+n;return this.commandKeyBinding[r]},this.handleKeyboard=function(e,t,n,r){if(r<0)return;var i=s[t]+n,o=this.commandKeyBinding[i];e.$keyChain&&(e.$keyChain+=" "+i,o=this.commandKeyBinding[e.$keyChain]||o);if(o)if(o=="chainKeys"||o[o.length-1]=="chainKeys")return e.$keyChain=e.$keyChain||i,{command:"null"};if(e.$keyChain)if(!!t&&t!=4||n.length!=1){if(t==-1||r>0)e.$keyChain=""}else e.$keyChain=e.$keyChain.slice(0,-i.length-1);return{command:o}},this.getStatusText=function(e,t){return t.$keyChain||""}}.call(o.prototype),t.HashHandler=o,t.MultiHashHandler=u}),ace.define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../keyboard/hash_handler").MultiHashHandler,s=e("../lib/event_emitter").EventEmitter,o=function(e,t){i.call(this,t,e),this.byName=this.commands,this.setDefaultHandler("exec",function(e){return e.command.exec(e.editor,e.args||{})})};r.inherits(o,i),function(){r.implement(this,s),this.exec=function(e,t,n){if(Array.isArray(e)){for(var r=e.length;r--;)if(this.exec(e[r],t,n))return!0;return!1}typeof e=="string"&&(e=this.commands[e]);if(!e)return!1;if(t&&t.$readOnly&&!e.readOnly)return!1;if(this.$checkCommandState!=0&&e.isAvailable&&!e.isAvailable(t))return!1;var i={editor:t,command:e,args:n};return i.returnValue=this._emit("exec",i),this._signal("afterExec",i),i.returnValue===!1?!1:!0},this.toggleRecording=function(e){if(this.$inReplay)return;return e&&e._emit("changeStatus"),this.recording?(this.macro.pop(),this.removeEventListener("exec",this.$addCommandToMacro),this.macro.length||(this.macro=this.oldMacro),this.recording=!1):(this.$addCommandToMacro||(this.$addCommandToMacro=function(e){this.macro.push([e.command,e.args])}.bind(this)),this.oldMacro=this.macro,this.macro=[],this.on("exec",this.$addCommandToMacro),this.recording=!0)},this.replay=function(e){if(this.$inReplay||!this.macro)return;if(this.recording)return this.toggleRecording(e);try{this.$inReplay=!0,this.macro.forEach(function(t){typeof t=="string"?this.exec(t,e):this.exec(t[0],e,t[1])},this)}finally{this.$inReplay=!1}},this.trimMacro=function(e){return e.map(function(e){return typeof e[0]!="string"&&(e[0]=e[0].name),e[1]||(e=e[0]),e})}}.call(o.prototype),t.CommandManager=o}),ace.define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"],function(e,t,n){"use strict";function o(e,t){return{win:e,mac:t}}var r=e("../lib/lang"),i=e("../config"),s=e("../range").Range;t.commands=[{name:"showSettingsMenu",bindKey:o("Ctrl-,","Command-,"),exec:function(e){i.loadModule("ace/ext/settings_menu",function(t){t.init(e),e.showSettingsMenu()})},readOnly:!0},{name:"goToNextError",bindKey:o("Alt-E","F4"),exec:function(e){i.loadModule("./ext/error_marker",function(t){t.showErrorMarker(e,1)})},scrollIntoView:"animate",readOnly:!0},{name:"goToPreviousError",bindKey:o("Alt-Shift-E","Shift-F4"),exec:function(e){i.loadModule("./ext/error_marker",function(t){t.showErrorMarker(e,-1)})},scrollIntoView:"animate",readOnly:!0},{name:"selectall",description:"Select all",bindKey:o("Ctrl-A","Command-A"),exec:function(e){e.selectAll()},readOnly:!0},{name:"centerselection",description:"Center selection",bindKey:o(null,"Ctrl-L"),exec:function(e){e.centerSelection()},readOnly:!0},{name:"gotoline",description:"Go to line...",bindKey:o("Ctrl-L","Command-L"),exec:function(e,t){typeof t=="number"&&!isNaN(t)&&e.gotoLine(t),e.prompt({$type:"gotoLine"})},readOnly:!0},{name:"fold",bindKey:o("Alt-L|Ctrl-F1","Command-Alt-L|Command-F1"),exec:function(e){e.session.toggleFold(!1)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"unfold",bindKey:o("Alt-Shift-L|Ctrl-Shift-F1","Command-Alt-Shift-L|Command-Shift-F1"),exec:function(e){e.session.toggleFold(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleFoldWidget",bindKey:o("F2","F2"),exec:function(e){e.session.toggleFoldWidget()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleParentFoldWidget",bindKey:o("Alt-F2","Alt-F2"),exec:function(e){e.session.toggleFoldWidget(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"foldall",description:"Fold all",bindKey:o(null,"Ctrl-Command-Option-0"),exec:function(e){e.session.foldAll()},scrollIntoView:"center",readOnly:!0},{name:"foldOther",description:"Fold other",bindKey:o("Alt-0","Command-Option-0"),exec:function(e){e.session.foldAll(),e.session.unfold(e.selection.getAllRanges())},scrollIntoView:"center",readOnly:!0},{name:"unfoldall",description:"Unfold all",bindKey:o("Alt-Shift-0","Command-Option-Shift-0"),exec:function(e){e.session.unfold()},scrollIntoView:"center",readOnly:!0},{name:"findnext",description:"Find next",bindKey:o("Ctrl-K","Command-G"),exec:function(e){e.findNext()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"findprevious",description:"Find previous",bindKey:o("Ctrl-Shift-K","Command-Shift-G"),exec:function(e){e.findPrevious()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"selectOrFindNext",description:"Select or find next",bindKey:o("Alt-K","Ctrl-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findNext()},readOnly:!0},{name:"selectOrFindPrevious",description:"Select or find previous",bindKey:o("Alt-Shift-K","Ctrl-Shift-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findPrevious()},readOnly:!0},{name:"find",description:"Find",bindKey:o("Ctrl-F","Command-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e)})},readOnly:!0},{name:"overwrite",description:"Overwrite",bindKey:"Insert",exec:function(e){e.toggleOverwrite()},readOnly:!0},{name:"selecttostart",description:"Select to start",bindKey:o("Ctrl-Shift-Home","Command-Shift-Home|Command-Shift-Up"),exec:function(e){e.getSelection().selectFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotostart",description:"Go to start",bindKey:o("Ctrl-Home","Command-Home|Command-Up"),exec:function(e){e.navigateFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectup",description:"Select up",bindKey:o("Shift-Up","Shift-Up|Ctrl-Shift-P"),exec:function(e){e.getSelection().selectUp()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golineup",description:"Go line up",bindKey:o("Up","Up|Ctrl-P"),exec:function(e,t){e.navigateUp(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttoend",description:"Select to end",bindKey:o("Ctrl-Shift-End","Command-Shift-End|Command-Shift-Down"),exec:function(e){e.getSelection().selectFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotoend",description:"Go to end",bindKey:o("Ctrl-End","Command-End|Command-Down"),exec:function(e){e.navigateFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectdown",description:"Select down",bindKey:o("Shift-Down","Shift-Down|Ctrl-Shift-N"),exec:function(e){e.getSelection().selectDown()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golinedown",description:"Go line down",bindKey:o("Down","Down|Ctrl-N"),exec:function(e,t){e.navigateDown(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordleft",description:"Select word left",bindKey:o("Ctrl-Shift-Left","Option-Shift-Left"),exec:function(e){e.getSelection().selectWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordleft",description:"Go to word left",bindKey:o("Ctrl-Left","Option-Left"),exec:function(e){e.navigateWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolinestart",description:"Select to line start",bindKey:o("Alt-Shift-Left","Command-Shift-Left|Ctrl-Shift-A"),exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolinestart",description:"Go to line start",bindKey:o("Alt-Left|Home","Command-Left|Home|Ctrl-A"),exec:function(e){e.navigateLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectleft",description:"Select left",bindKey:o("Shift-Left","Shift-Left|Ctrl-Shift-B"),exec:function(e){e.getSelection().selectLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoleft",description:"Go to left",bindKey:o("Left","Left|Ctrl-B"),exec:function(e,t){e.navigateLeft(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordright",description:"Select word right",bindKey:o("Ctrl-Shift-Right","Option-Shift-Right"),exec:function(e){e.getSelection().selectWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordright",description:"Go to word right",bindKey:o("Ctrl-Right","Option-Right"),exec:function(e){e.navigateWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolineend",description:"Select to line end",bindKey:o("Alt-Shift-Right","Command-Shift-Right|Shift-End|Ctrl-Shift-E"),exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolineend",description:"Go to line end",bindKey:o("Alt-Right|End","Command-Right|End|Ctrl-E"),exec:function(e){e.navigateLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectright",description:"Select right",bindKey:o("Shift-Right","Shift-Right"),exec:function(e){e.getSelection().selectRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoright",description:"Go to right",bindKey:o("Right","Right|Ctrl-F"),exec:function(e,t){e.navigateRight(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectpagedown",description:"Select page down",bindKey:"Shift-PageDown",exec:function(e){e.selectPageDown()},readOnly:!0},{name:"pagedown",description:"Page down",bindKey:o(null,"Option-PageDown"),exec:function(e){e.scrollPageDown()},readOnly:!0},{name:"gotopagedown",description:"Go to page down",bindKey:o("PageDown","PageDown|Ctrl-V"),exec:function(e){e.gotoPageDown()},readOnly:!0},{name:"selectpageup",description:"Select page up",bindKey:"Shift-PageUp",exec:function(e){e.selectPageUp()},readOnly:!0},{name:"pageup",description:"Page up",bindKey:o(null,"Option-PageUp"),exec:function(e){e.scrollPageUp()},readOnly:!0},{name:"gotopageup",description:"Go to page up",bindKey:"PageUp",exec:function(e){e.gotoPageUp()},readOnly:!0},{name:"scrollup",description:"Scroll up",bindKey:o("Ctrl-Up",null),exec:function(e){e.renderer.scrollBy(0,-2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"scrolldown",description:"Scroll down",bindKey:o("Ctrl-Down",null),exec:function(e){e.renderer.scrollBy(0,2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"selectlinestart",description:"Select line start",bindKey:"Shift-Home",exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectlineend",description:"Select line end",bindKey:"Shift-End",exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"togglerecording",description:"Toggle recording",bindKey:o("Ctrl-Alt-E","Command-Option-E"),exec:function(e){e.commands.toggleRecording(e)},readOnly:!0},{name:"replaymacro",description:"Replay macro",bindKey:o("Ctrl-Shift-E","Command-Shift-E"),exec:function(e){e.commands.replay(e)},readOnly:!0},{name:"jumptomatching",description:"Jump to matching",bindKey:o("Ctrl-P","Ctrl-P"),exec:function(e){e.jumpToMatching()},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"selecttomatching",description:"Select to matching",bindKey:o("Ctrl-Shift-P","Ctrl-Shift-P"),exec:function(e){e.jumpToMatching(!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"expandToMatching",description:"Expand to matching",bindKey:o("Ctrl-Shift-M","Ctrl-Shift-M"),exec:function(e){e.jumpToMatching(!0,!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"passKeysToBrowser",description:"Pass keys to browser",bindKey:o(null,null),exec:function(){},passEvent:!0,readOnly:!0},{name:"copy",description:"Copy",exec:function(e){},readOnly:!0},{name:"cut",description:"Cut",exec:function(e){var t=e.$copyWithEmptySelection&&e.selection.isEmpty(),n=t?e.selection.getLineRange():e.selection.getRange();e._emit("cut",n),n.isEmpty()||e.session.remove(n),e.clearSelection()},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"paste",description:"Paste",exec:function(e,t){e.$handlePaste(t)},scrollIntoView:"cursor"},{name:"removeline",description:"Remove line",bindKey:o("Ctrl-D","Command-D"),exec:function(e){e.removeLines()},scrollIntoView:"cursor",multiSelectAction:"forEachLine"},{name:"duplicateSelection",description:"Duplicate selection",bindKey:o("Ctrl-Shift-D","Command-Shift-D"),exec:function(e){e.duplicateSelection()},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"sortlines",description:"Sort lines",bindKey:o("Ctrl-Alt-S","Command-Alt-S"),exec:function(e){e.sortLines()},scrollIntoView:"selection",multiSelectAction:"forEachLine"},{name:"togglecomment",description:"Toggle comment",bindKey:o("Ctrl-/","Command-/"),exec:function(e){e.toggleCommentLines()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"toggleBlockComment",description:"Toggle block comment",bindKey:o("Ctrl-Shift-/","Command-Shift-/"),exec:function(e){e.toggleBlockComment()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"modifyNumberUp",description:"Modify number up",bindKey:o("Ctrl-Shift-Up","Alt-Shift-Up"),exec:function(e){e.modifyNumber(1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"modifyNumberDown",description:"Modify number down",bindKey:o("Ctrl-Shift-Down","Alt-Shift-Down"),exec:function(e){e.modifyNumber(-1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"replace",description:"Replace",bindKey:o("Ctrl-H","Command-Option-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e,!0)})}},{name:"undo",description:"Undo",bindKey:o("Ctrl-Z","Command-Z"),exec:function(e){e.undo()}},{name:"redo",description:"Redo",bindKey:o("Ctrl-Shift-Z|Ctrl-Y","Command-Shift-Z|Command-Y"),exec:function(e){e.redo()}},{name:"copylinesup",description:"Copy lines up",bindKey:o("Alt-Shift-Up","Command-Option-Up"),exec:function(e){e.copyLinesUp()},scrollIntoView:"cursor"},{name:"movelinesup",description:"Move lines up",bindKey:o("Alt-Up","Option-Up"),exec:function(e){e.moveLinesUp()},scrollIntoView:"cursor"},{name:"copylinesdown",description:"Copy lines down",bindKey:o("Alt-Shift-Down","Command-Option-Down"),exec:function(e){e.copyLinesDown()},scrollIntoView:"cursor"},{name:"movelinesdown",description:"Move lines down",bindKey:o("Alt-Down","Option-Down"),exec:function(e){e.moveLinesDown()},scrollIntoView:"cursor"},{name:"del",description:"Delete",bindKey:o("Delete","Delete|Ctrl-D|Shift-Delete"),exec:function(e){e.remove("right")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"backspace",description:"Backspace",bindKey:o("Shift-Backspace|Backspace","Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H"),exec:function(e){e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"cut_or_delete",description:"Cut or delete",bindKey:o("Shift-Delete",null),exec:function(e){if(!e.selection.isEmpty())return!1;e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestart",description:"Remove to line start",bindKey:o("Alt-Backspace","Command-Backspace"),exec:function(e){e.removeToLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineend",description:"Remove to line end",bindKey:o("Alt-Delete","Ctrl-K|Command-Delete"),exec:function(e){e.removeToLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestarthard",description:"Remove to line start hard",bindKey:o("Ctrl-Shift-Backspace",null),exec:function(e){var t=e.selection.getRange();t.start.column=0,e.session.remove(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineendhard",description:"Remove to line end hard",bindKey:o("Ctrl-Shift-Delete",null),exec:function(e){var t=e.selection.getRange();t.end.column=Number.MAX_VALUE,e.session.remove(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordleft",description:"Remove word left",bindKey:o("Ctrl-Backspace","Alt-Backspace|Ctrl-Alt-Backspace"),exec:function(e){e.removeWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordright",description:"Remove word right",bindKey:o("Ctrl-Delete","Alt-Delete"),exec:function(e){e.removeWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"outdent",description:"Outdent",bindKey:o("Shift-Tab","Shift-Tab"),exec:function(e){e.blockOutdent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"indent",description:"Indent",bindKey:o("Tab","Tab"),exec:function(e){e.indent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"blockoutdent",description:"Block outdent",bindKey:o("Ctrl-[","Ctrl-["),exec:function(e){e.blockOutdent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"blockindent",description:"Block indent",bindKey:o("Ctrl-]","Ctrl-]"),exec:function(e){e.blockIndent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"insertstring",description:"Insert string",exec:function(e,t){e.insert(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"inserttext",description:"Insert text",exec:function(e,t){e.insert(r.stringRepeat(t.text||"",t.times||1))},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"splitline",description:"Split line",bindKey:o(null,"Ctrl-O"),exec:function(e){e.splitLine()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"transposeletters",description:"Transpose letters",bindKey:o("Alt-Shift-X","Ctrl-T"),exec:function(e){e.transposeLetters()},multiSelectAction:function(e){e.transposeSelections(1)},scrollIntoView:"cursor"},{name:"touppercase",description:"To uppercase",bindKey:o("Ctrl-U","Ctrl-U"),exec:function(e){e.toUpperCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"tolowercase",description:"To lowercase",bindKey:o("Ctrl-Shift-U","Ctrl-Shift-U"),exec:function(e){e.toLowerCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"expandtoline",description:"Expand to line",bindKey:o("Ctrl-Shift-L","Command-Shift-L"),exec:function(e){var t=e.selection.getRange();t.start.column=t.end.column=0,t.end.row++,e.selection.setRange(t,!1)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"joinlines",description:"Join lines",bindKey:o(null,null),exec:function(e){var t=e.selection.isBackwards(),n=t?e.selection.getSelectionLead():e.selection.getSelectionAnchor(),i=t?e.selection.getSelectionAnchor():e.selection.getSelectionLead(),o=e.session.doc.getLine(n.row).length,u=e.session.doc.getTextRange(e.selection.getRange()),a=u.replace(/\n\s*/," ").length,f=e.session.doc.getLine(n.row);for(var l=n.row+1;l<=i.row+1;l++){var c=r.stringTrimLeft(r.stringTrimRight(e.session.doc.getLine(l)));c.length!==0&&(c=" "+c),f+=c}i.row+10?(e.selection.moveCursorTo(n.row,n.column),e.selection.selectTo(n.row,n.column+a)):(o=e.session.doc.getLine(n.row).length>o?o+1:o,e.selection.moveCursorTo(n.row,o))},multiSelectAction:"forEach",readOnly:!0},{name:"invertSelection",description:"Invert selection",bindKey:o(null,null),exec:function(e){var t=e.session.doc.getLength()-1,n=e.session.doc.getLine(t).length,r=e.selection.rangeList.ranges,i=[];r.length<1&&(r=[e.selection.getRange()]);for(var o=0;o=i.lastRow||r.end.row<=i.firstRow)&&this.renderer.scrollSelectionIntoView(this.selection.anchor,this.selection.lead);break;default:}n=="animate"&&this.renderer.animateScrolling(this.curOp.scrollTop)}var s=this.selection.toJSON();this.curOp.selectionAfter=s,this.$lastSel=this.selection.toJSON(),this.session.getUndoManager().addSelection(s),this.prevOp=this.curOp,this.curOp=null}},this.$mergeableCommands=["backspace","del","insertstring"],this.$historyTracker=function(e){if(!this.$mergeUndoDeltas)return;var t=this.prevOp,n=this.$mergeableCommands,r=t.command&&e.command.name==t.command.name;if(e.command.name=="insertstring"){var i=e.args;this.mergeNextCommand===undefined&&(this.mergeNextCommand=!0),r=r&&this.mergeNextCommand&&(!/\s/.test(i)||/\s/.test(t.args)),this.mergeNextCommand=!0}else r=r&&n.indexOf(e.command.name)!==-1;this.$mergeUndoDeltas!="always"&&Date.now()-this.sequenceStartTime>2e3&&(r=!1),r?this.session.mergeUndoDeltas=!0:n.indexOf(e.command.name)!==-1&&(this.sequenceStartTime=Date.now())},this.setKeyboardHandler=function(e,t){if(e&&typeof e=="string"&&e!="ace"){this.$keybindingId=e;var n=this;g.loadModule(["keybinding",e],function(r){n.$keybindingId==e&&n.keyBinding.setKeyboardHandler(r&&r.handler),t&&t()})}else this.$keybindingId=null,this.keyBinding.setKeyboardHandler(e),t&&t()},this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()},this.setSession=function(e){if(this.session==e)return;this.curOp&&this.endOperation(),this.curOp={};var t=this.session;if(t){this.session.off("change",this.$onDocumentChange),this.session.off("changeMode",this.$onChangeMode),this.session.off("tokenizerUpdate",this.$onTokenizerUpdate),this.session.off("changeTabSize",this.$onChangeTabSize),this.session.off("changeWrapLimit",this.$onChangeWrapLimit),this.session.off("changeWrapMode",this.$onChangeWrapMode),this.session.off("changeFold",this.$onChangeFold),this.session.off("changeFrontMarker",this.$onChangeFrontMarker),this.session.off("changeBackMarker",this.$onChangeBackMarker),this.session.off("changeBreakpoint",this.$onChangeBreakpoint),this.session.off("changeAnnotation",this.$onChangeAnnotation),this.session.off("changeOverwrite",this.$onCursorChange),this.session.off("changeScrollTop",this.$onScrollTopChange),this.session.off("changeScrollLeft",this.$onScrollLeftChange);var n=this.session.getSelection();n.off("changeCursor",this.$onCursorChange),n.off("changeSelection",this.$onSelectionChange)}this.session=e,e?(this.$onDocumentChange=this.onDocumentChange.bind(this),e.on("change",this.$onDocumentChange),this.renderer.setSession(e),this.$onChangeMode=this.onChangeMode.bind(this),e.on("changeMode",this.$onChangeMode),this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this),e.on("tokenizerUpdate",this.$onTokenizerUpdate),this.$onChangeTabSize=this.renderer.onChangeTabSize.bind(this.renderer),e.on("changeTabSize",this.$onChangeTabSize),this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this),e.on("changeWrapLimit",this.$onChangeWrapLimit),this.$onChangeWrapMode=this.onChangeWrapMode.bind(this),e.on("changeWrapMode",this.$onChangeWrapMode),this.$onChangeFold=this.onChangeFold.bind(this),e.on("changeFold",this.$onChangeFold),this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this),this.session.on("changeFrontMarker",this.$onChangeFrontMarker),this.$onChangeBackMarker=this.onChangeBackMarker.bind(this),this.session.on("changeBackMarker",this.$onChangeBackMarker),this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this),this.session.on("changeBreakpoint",this.$onChangeBreakpoint),this.$onChangeAnnotation=this.onChangeAnnotation.bind(this),this.session.on("changeAnnotation",this.$onChangeAnnotation),this.$onCursorChange=this.onCursorChange.bind(this),this.session.on("changeOverwrite",this.$onCursorChange),this.$onScrollTopChange=this.onScrollTopChange.bind(this),this.session.on("changeScrollTop",this.$onScrollTopChange),this.$onScrollLeftChange=this.onScrollLeftChange.bind(this),this.session.on("changeScrollLeft",this.$onScrollLeftChange),this.selection=e.getSelection(),this.selection.on("changeCursor",this.$onCursorChange),this.$onSelectionChange=this.onSelectionChange.bind(this),this.selection.on("changeSelection",this.$onSelectionChange),this.onChangeMode(),this.onCursorChange(),this.onScrollTopChange(),this.onScrollLeftChange(),this.onSelectionChange(),this.onChangeFrontMarker(),this.onChangeBackMarker(),this.onChangeBreakpoint(),this.onChangeAnnotation(),this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit(),this.renderer.updateFull()):(this.selection=null,this.renderer.setSession(e)),this._signal("changeSession",{session:e,oldSession:t}),this.curOp=null,t&&t._signal("changeEditor",{oldEditor:this}),e&&e._signal("changeEditor",{editor:this}),e&&e.bgTokenizer&&e.bgTokenizer.scheduleStart()},this.getSession=function(){return this.session},this.setValue=function(e,t){return this.session.doc.setValue(e),t?t==1?this.navigateFileEnd():t==-1&&this.navigateFileStart():this.selectAll(),e},this.getValue=function(){return this.session.getValue()},this.getSelection=function(){return this.selection},this.resize=function(e){this.renderer.onResize(e)},this.setTheme=function(e,t){this.renderer.setTheme(e,t)},this.getTheme=function(){return this.renderer.getTheme()},this.setStyle=function(e){this.renderer.setStyle(e)},this.unsetStyle=function(e){this.renderer.unsetStyle(e)},this.getFontSize=function(){return this.getOption("fontSize")||i.computedStyle(this.container).fontSize},this.setFontSize=function(e){this.setOption("fontSize",e)},this.$highlightBrackets=function(){this.session.$bracketHighlight&&(this.session.removeMarker(this.session.$bracketHighlight),this.session.$bracketHighlight=null);if(this.$highlightPending)return;var e=this;this.$highlightPending=!0,setTimeout(function(){e.$highlightPending=!1;var t=e.session;if(!t||!t.bgTokenizer)return;var n=t.findMatchingBracket(e.getCursorPosition());if(n)var r=new p(n.row,n.column,n.row,n.column+1);else if(t.$mode.getMatching)var r=t.$mode.getMatching(e.session);r&&(t.$bracketHighlight=t.addMarker(r,"ace_bracket","text"))},50)},this.$highlightTags=function(){if(this.$highlightTagPending)return;var e=this;this.$highlightTagPending=!0,setTimeout(function(){e.$highlightTagPending=!1;var t=e.session;if(!t||!t.bgTokenizer)return;var n=e.getCursorPosition(),r=new y(e.session,n.row,n.column),i=r.getCurrentToken();if(!i||!/\b(?:tag-open|tag-name)/.test(i.type)){t.removeMarker(t.$tagHighlight),t.$tagHighlight=null;return}if(i.type.indexOf("tag-open")!=-1){i=r.stepForward();if(!i)return}var s=i.value,o=0,u=r.stepBackward();if(u.value=="<"){do u=i,i=r.stepForward(),i&&i.value===s&&i.type.indexOf("tag-name")!==-1&&(u.value==="<"?o++:u.value==="=0)}else{do i=u,u=r.stepBackward(),i&&i.value===s&&i.type.indexOf("tag-name")!==-1&&(u.value==="<"?o++:u.value==="1)&&(t=!1)}if(e.$highlightLineMarker&&!t)e.removeMarker(e.$highlightLineMarker.id),e.$highlightLineMarker=null;else if(!e.$highlightLineMarker&&t){var n=new p(t.row,t.column,t.row,Infinity);n.id=e.addMarker(n,"ace_active-line","screenLine"),e.$highlightLineMarker=n}else t&&(e.$highlightLineMarker.start.row=t.row,e.$highlightLineMarker.end.row=t.row,e.$highlightLineMarker.start.column=t.column,e._signal("changeBackMarker"))},this.onSelectionChange=function(e){var t=this.session;t.$selectionMarker&&t.removeMarker(t.$selectionMarker),t.$selectionMarker=null;if(!this.selection.isEmpty()){var n=this.selection.getRange(),r=this.getSelectionStyle();t.$selectionMarker=t.addMarker(n,"ace_selection",r)}else this.$updateHighlightActiveLine();var i=this.$highlightSelectedWord&&this.$getSelectionHighLightRegexp();this.session.highlight(i),this._signal("changeSelection")},this.$getSelectionHighLightRegexp=function(){var e=this.session,t=this.getSelectionRange();if(t.isEmpty()||t.isMultiLine())return;var n=t.start.column,r=t.end.column,i=e.getLine(t.start.row),s=i.substring(n,r);if(s.length>5e3||!/[\w\d]/.test(s))return;var o=this.$search.$assembleRegExp({wholeWord:!0,caseSensitive:!0,needle:s}),u=i.substring(n-1,r+1);if(!o.test(u))return;return o},this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()},this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()},this.onChangeBreakpoint=function(){this.renderer.updateBreakpoints()},this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())},this.onChangeMode=function(e){this.renderer.updateText(),this._emit("changeMode",e)},this.onChangeWrapLimit=function(){this.renderer.updateFull()},this.onChangeWrapMode=function(){this.renderer.onResize(!0)},this.onChangeFold=function(){this.$updateHighlightActiveLine(),this.renderer.updateFull()},this.getSelectedText=function(){return this.session.getTextRange(this.getSelectionRange())},this.getCopyText=function(){var e=this.getSelectedText(),t=this.session.doc.getNewLineCharacter(),n=!1;if(!e&&this.$copyWithEmptySelection){n=!0;var r=this.selection.getAllRanges();for(var i=0;is.length||i.length<2||!i[1])return this.commands.exec("insertstring",this,t);for(var o=s.length;o--;){var u=s[o];u.isEmpty()||r.remove(u),r.insert(u.start,i[o])}}},this.execCommand=function(e,t){return this.commands.exec(e,this,t)},this.insert=function(e,t){var n=this.session,r=n.getMode(),i=this.getCursorPosition();if(this.getBehavioursEnabled()&&!t){var s=r.transformAction(n.getState(i.row),"insertion",this,n,e);s&&(e!==s.text&&(this.inVirtualSelectionMode||(this.session.mergeUndoDeltas=!1,this.mergeNextCommand=!1)),e=s.text)}e==" "&&(e=this.session.getTabString());if(!this.selection.isEmpty()){var o=this.getSelectionRange();i=this.session.remove(o),this.clearSelection()}else if(this.session.getOverwrite()&&e.indexOf("\n")==-1){var o=new p.fromPoints(i,i);o.end.column+=e.length,this.session.remove(o)}if(e=="\n"||e=="\r\n"){var u=n.getLine(i.row);if(i.column>u.search(/\S|$/)){var a=u.substr(i.column).search(/\S|$/);n.doc.removeInLine(i.row,i.column,i.column+a)}}this.clearSelection();var f=i.column,l=n.getState(i.row),u=n.getLine(i.row),c=r.checkOutdent(l,u,e),h=n.insert(i,e);s&&s.selection&&(s.selection.length==2?this.selection.setSelectionRange(new p(i.row,f+s.selection[0],i.row,f+s.selection[1])):this.selection.setSelectionRange(new p(i.row+s.selection[0],s.selection[1],i.row+s.selection[2],s.selection[3])));if(n.getDocument().isNewLine(e)){var d=r.getNextLineIndent(l,u.slice(0,i.column),n.getTabString());n.insert({row:i.row+1,column:0},d)}c&&r.autoOutdent(l,n,i.row)},this.onTextInput=function(e,t){if(!t)return this.keyBinding.onTextInput(e);this.startOperation({command:{name:"insertstring"}});var n=this.applyComposition.bind(this,e,t);this.selection.rangeCount?this.forEachSelection(n):n(),this.endOperation()},this.applyComposition=function(e,t){if(t.extendLeft||t.extendRight){var n=this.selection.getRange();n.start.column-=t.extendLeft,n.end.column+=t.extendRight,this.selection.setRange(n),!e&&!n.isEmpty()&&this.remove()}(e||!this.selection.isEmpty())&&this.insert(e,!0);if(t.restoreStart||t.restoreEnd){var n=this.selection.getRange();n.start.column-=t.restoreStart,n.end.column-=t.restoreEnd,this.selection.setRange(n)}},this.onCommandKey=function(e,t,n){this.keyBinding.onCommandKey(e,t,n)},this.setOverwrite=function(e){this.session.setOverwrite(e)},this.getOverwrite=function(){return this.session.getOverwrite()},this.toggleOverwrite=function(){this.session.toggleOverwrite()},this.setScrollSpeed=function(e){this.setOption("scrollSpeed",e)},this.getScrollSpeed=function(){return this.getOption("scrollSpeed")},this.setDragDelay=function(e){this.setOption("dragDelay",e)},this.getDragDelay=function(){return this.getOption("dragDelay")},this.setSelectionStyle=function(e){this.setOption("selectionStyle",e)},this.getSelectionStyle=function(){return this.getOption("selectionStyle")},this.setHighlightActiveLine=function(e){this.setOption("highlightActiveLine",e)},this.getHighlightActiveLine=function(){return this.getOption("highlightActiveLine")},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.setHighlightSelectedWord=function(e){this.setOption("highlightSelectedWord",e)},this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord},this.setAnimatedScroll=function(e){this.renderer.setAnimatedScroll(e)},this.getAnimatedScroll=function(){return this.renderer.getAnimatedScroll()},this.setShowInvisibles=function(e){this.renderer.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()},this.setDisplayIndentGuides=function(e){this.renderer.setDisplayIndentGuides(e)},this.getDisplayIndentGuides=function(){return this.renderer.getDisplayIndentGuides()},this.setShowPrintMargin=function(e){this.renderer.setShowPrintMargin(e)},this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()},this.setPrintMarginColumn=function(e){this.renderer.setPrintMarginColumn(e)},this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()},this.setReadOnly=function(e){this.setOption("readOnly",e)},this.getReadOnly=function(){return this.getOption("readOnly")},this.setBehavioursEnabled=function(e){this.setOption("behavioursEnabled",e)},this.getBehavioursEnabled=function(){return this.getOption("behavioursEnabled")},this.setWrapBehavioursEnabled=function(e){this.setOption("wrapBehavioursEnabled",e)},this.getWrapBehavioursEnabled=function(){return this.getOption("wrapBehavioursEnabled")},this.setShowFoldWidgets=function(e){this.setOption("showFoldWidgets",e)},this.getShowFoldWidgets=function(){return this.getOption("showFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.remove=function(e){this.selection.isEmpty()&&(e=="left"?this.selection.selectLeft():this.selection.selectRight());var t=this.getSelectionRange();if(this.getBehavioursEnabled()){var n=this.session,r=n.getState(t.start.row),i=n.getMode().transformAction(r,"deletion",this,n,t);if(t.end.column===0){var s=n.getTextRange(t);if(s[s.length-1]=="\n"){var o=n.getLine(t.end.row);/^\s+$/.test(o)&&(t.end.column=o.length)}}i&&(t=i)}this.session.remove(t),this.clearSelection()},this.removeWordRight=function(){this.selection.isEmpty()&&this.selection.selectWordRight(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeWordLeft=function(){this.selection.isEmpty()&&this.selection.selectWordLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineStart=function(){this.selection.isEmpty()&&this.selection.selectLineStart(),this.selection.isEmpty()&&this.selection.selectLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineEnd=function(){this.selection.isEmpty()&&this.selection.selectLineEnd();var e=this.getSelectionRange();e.start.column==e.end.column&&e.start.row==e.end.row&&(e.end.column=0,e.end.row++),this.session.remove(e),this.clearSelection()},this.splitLine=function(){this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection());var e=this.getCursorPosition();this.insert("\n"),this.moveCursorToPosition(e)},this.transposeLetters=function(){if(!this.selection.isEmpty())return;var e=this.getCursorPosition(),t=e.column;if(t===0)return;var n=this.session.getLine(e.row),r,i;tt.toLowerCase()?1:0});var i=new p(0,0,0,0);for(var r=e.first;r<=e.last;r++){var s=t.getLine(r);i.start.row=r,i.end.row=r,i.end.column=s.length,t.replace(i,n[r-e.first])}},this.toggleCommentLines=function(){var e=this.session.getState(this.getCursorPosition().row),t=this.$getSelectedRows();this.session.getMode().toggleCommentLines(e,this.session,t.first,t.last)},this.toggleBlockComment=function(){var e=this.getCursorPosition(),t=this.session.getState(e.row),n=this.getSelectionRange();this.session.getMode().toggleBlockComment(t,this.session,n,e)},this.getNumberAt=function(e,t){var n=/[\-]?[0-9]+(?:\.[0-9]+)?/g;n.lastIndex=0;var r=this.session.getLine(e);while(n.lastIndex=t){var s={value:i[0],start:i.index,end:i.index+i[0].length};return s}}return null},this.modifyNumber=function(e){var t=this.selection.getCursor().row,n=this.selection.getCursor().column,r=new p(t,n-1,t,n),i=this.session.getTextRange(r);if(!isNaN(parseFloat(i))&&isFinite(i)){var s=this.getNumberAt(t,n);if(s){var o=s.value.indexOf(".")>=0?s.start+s.value.indexOf(".")+1:s.end,u=s.start+s.value.length-o,a=parseFloat(s.value);a*=Math.pow(10,u),o!==s.end&&n=u&&o<=a&&(n=t,f.selection.clearSelection(),f.moveCursorTo(e,u+r),f.selection.selectTo(e,a+r)),u=a});var l=this.$toggleWordPairs,c;for(var h=0;hp+1)break;p=d.last}l--,u=this.session.$moveLines(h,p,t?0:e),t&&e==-1&&(c=l+1);while(c<=l)o[c].moveBy(u,0),c++;t||(u=0),a+=u}i.fromOrientedRange(i.ranges[0]),i.rangeList.attach(this.session),this.inVirtualSelectionMode=!1}},this.$getSelectedRows=function(e){return e=(e||this.getSelectionRange()).collapseRows(),{first:this.session.getRowFoldStart(e.start.row),last:this.session.getRowFoldEnd(e.end.row)}},this.onCompositionStart=function(e){this.renderer.showComposition(e)},this.onCompositionUpdate=function(e){this.renderer.setCompositionText(e)},this.onCompositionEnd=function(){this.renderer.hideComposition()},this.getFirstVisibleRow=function(){return this.renderer.getFirstVisibleRow()},this.getLastVisibleRow=function(){return this.renderer.getLastVisibleRow()},this.isRowVisible=function(e){return e>=this.getFirstVisibleRow()&&e<=this.getLastVisibleRow()},this.isRowFullyVisible=function(e){return e>=this.renderer.getFirstFullyVisibleRow()&&e<=this.renderer.getLastFullyVisibleRow()},this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1},this.$moveByPage=function(e,t){var n=this.renderer,r=this.renderer.layerConfig,i=e*Math.floor(r.height/r.lineHeight);t===!0?this.selection.$moveSelection(function(){this.moveCursorBy(i,0)}):t===!1&&(this.selection.moveCursorBy(i,0),this.selection.clearSelection());var s=n.scrollTop;n.scrollBy(0,i*r.lineHeight),t!=null&&n.scrollCursorIntoView(null,.5),n.animateScrolling(s)},this.selectPageDown=function(){this.$moveByPage(1,!0)},this.selectPageUp=function(){this.$moveByPage(-1,!0)},this.gotoPageDown=function(){this.$moveByPage(1,!1)},this.gotoPageUp=function(){this.$moveByPage(-1,!1)},this.scrollPageDown=function(){this.$moveByPage(1)},this.scrollPageUp=function(){this.$moveByPage(-1)},this.scrollToRow=function(e){this.renderer.scrollToRow(e)},this.scrollToLine=function(e,t,n,r){this.renderer.scrollToLine(e,t,n,r)},this.centerSelection=function(){var e=this.getSelectionRange(),t={row:Math.floor(e.start.row+(e.end.row-e.start.row)/2),column:Math.floor(e.start.column+(e.end.column-e.start.column)/2)};this.renderer.alignCursor(t,.5)},this.getCursorPosition=function(){return this.selection.getCursor()},this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())},this.getSelectionRange=function(){return this.selection.getRange()},this.selectAll=function(){this.selection.selectAll()},this.clearSelection=function(){this.selection.clearSelection()},this.moveCursorTo=function(e,t){this.selection.moveCursorTo(e,t)},this.moveCursorToPosition=function(e){this.selection.moveCursorToPosition(e)},this.jumpToMatching=function(e,t){var n=this.getCursorPosition(),r=new y(this.session,n.row,n.column),i=r.getCurrentToken(),s=i||r.stepForward();if(!s)return;var o,u=!1,a={},f=n.column-s.start,l,c={")":"(","(":"(","]":"[","[":"[","{":"{","}":"{"};do{if(s.value.match(/[{}()\[\]]/g))for(;f=0;--s)this.$tryReplace(n[s],e)&&r++;return this.selection.setSelectionRange(i),r},this.$tryReplace=function(e,t){var n=this.session.getTextRange(e);return t=this.$search.replace(n,t),t!==null?(e.end=this.session.replace(e,t),e):null},this.getLastSearchOptions=function(){return this.$search.getOptions()},this.find=function(e,t,n){t||(t={}),typeof e=="string"||e instanceof RegExp?t.needle=e:typeof e=="object"&&r.mixin(t,e);var i=this.selection.getRange();t.needle==null&&(e=this.session.getTextRange(i)||this.$search.$options.needle,e||(i=this.session.getWordRange(i.start.row,i.start.column),e=this.session.getTextRange(i)),this.$search.set({needle:e})),this.$search.set(t),t.start||this.$search.set({start:i});var s=this.$search.find(this.session);if(t.preventScroll)return s;if(s)return this.revealRange(s,n),s;t.backwards?i.start=i.end:i.end=i.start,this.selection.setRange(i)},this.findNext=function(e,t){this.find({skipCurrent:!0,backwards:!1},e,t)},this.findPrevious=function(e,t){this.find(e,{skipCurrent:!0,backwards:!0},t)},this.revealRange=function(e,t){this.session.unfold(e),this.selection.setSelectionRange(e);var n=this.renderer.scrollTop;this.renderer.scrollSelectionIntoView(e.start,e.end,.5),t!==!1&&this.renderer.animateScrolling(n)},this.undo=function(){this.session.getUndoManager().undo(this.session),this.renderer.scrollCursorIntoView(null,.5)},this.redo=function(){this.session.getUndoManager().redo(this.session),this.renderer.scrollCursorIntoView(null,.5)},this.destroy=function(){this.renderer.destroy(),this._signal("destroy",this),this.session&&this.session.destroy()},this.setAutoScrollEditorIntoView=function(e){if(!e)return;var t,n=this,r=!1;this.$scrollAnchor||(this.$scrollAnchor=document.createElement("div"));var i=this.$scrollAnchor;i.style.cssText="position:absolute",this.container.insertBefore(i,this.container.firstChild);var s=this.on("changeSelection",function(){r=!0}),o=this.renderer.on("beforeRender",function(){r&&(t=n.renderer.container.getBoundingClientRect())}),u=this.renderer.on("afterRender",function(){if(r&&t&&(n.isFocused()||n.searchBox&&n.searchBox.isFocused())){var e=n.renderer,s=e.$cursorLayer.$pixelPos,o=e.layerConfig,u=s.top-o.offset;s.top>=0&&u+t.top<0?r=!0:s.topwindow.innerHeight?r=!1:r=null,r!=null&&(i.style.top=u+"px",i.style.left=s.left+"px",i.style.height=o.lineHeight+"px",i.scrollIntoView(r)),r=t=null}});this.setAutoScrollEditorIntoView=function(e){if(e)return;delete this.setAutoScrollEditorIntoView,this.off("changeSelection",s),this.renderer.off("afterRender",u),this.renderer.off("beforeRender",o)}},this.$resetCursorStyle=function(){var e=this.$cursorStyle||"ace",t=this.renderer.$cursorLayer;if(!t)return;t.setSmoothBlinking(/smooth/.test(e)),t.isBlinking=!this.$readOnly&&e!="wide",i.setCssClass(t.element,"ace_slim-cursors",/slim/.test(e))},this.prompt=function(e,t,n){var r=this;g.loadModule("./ext/prompt",function(i){i.prompt(r,e,t,n)})}}.call(w.prototype),g.defineOptions(w.prototype,"editor",{selectionStyle:{set:function(e){this.onSelectionChange(),this._signal("changeSelectionStyle",{data:e})},initialValue:"line"},highlightActiveLine:{set:function(){this.$updateHighlightActiveLine()},initialValue:!0},highlightSelectedWord:{set:function(e){this.$onSelectionChange()},initialValue:!0},readOnly:{set:function(e){this.textInput.setReadOnly(e),this.$resetCursorStyle()},initialValue:!1},copyWithEmptySelection:{set:function(e){this.textInput.setCopyWithEmptySelection(e)},initialValue:!1},cursorStyle:{set:function(e){this.$resetCursorStyle()},values:["ace","slim","smooth","wide"],initialValue:"ace"},mergeUndoDeltas:{values:[!1,!0,"always"],initialValue:!0},behavioursEnabled:{initialValue:!0},wrapBehavioursEnabled:{initialValue:!0},autoScrollEditorIntoView:{set:function(e){this.setAutoScrollEditorIntoView(e)}},keyboardHandler:{set:function(e){this.setKeyboardHandler(e)},get:function(){return this.$keybindingId},handlesSet:!0},value:{set:function(e){this.session.setValue(e)},get:function(){return this.getValue()},handlesSet:!0,hidden:!0},session:{set:function(e){this.setSession(e)},get:function(){return this.session},handlesSet:!0,hidden:!0},showLineNumbers:{set:function(e){this.renderer.$gutterLayer.setShowLineNumbers(e),this.renderer.$loop.schedule(this.renderer.CHANGE_GUTTER),e&&this.$relativeLineNumbers?E.attach(this):E.detach(this)},initialValue:!0},relativeLineNumbers:{set:function(e){this.$showLineNumbers&&e?E.attach(this):E.detach(this)}},hScrollBarAlwaysVisible:"renderer",vScrollBarAlwaysVisible:"renderer",highlightGutterLine:"renderer",animatedScroll:"renderer",showInvisibles:"renderer",showPrintMargin:"renderer",printMarginColumn:"renderer",printMargin:"renderer",fadeFoldWidgets:"renderer",showFoldWidgets:"renderer",displayIndentGuides:"renderer",showGutter:"renderer",fontSize:"renderer",fontFamily:"renderer",maxLines:"renderer",minLines:"renderer",scrollPastEnd:"renderer",fixedWidthGutter:"renderer",theme:"renderer",hasCssTransforms:"renderer",maxPixelHeight:"renderer",useTextareaForIME:"renderer",scrollSpeed:"$mouseHandler",dragDelay:"$mouseHandler",dragEnabled:"$mouseHandler",focusTimeout:"$mouseHandler",tooltipFollowsMouse:"$mouseHandler",firstLineNumber:"session",overwrite:"session",newLineMode:"session",useWorker:"session",useSoftTabs:"session",navigateWithinSoftTabs:"session",tabSize:"session",wrap:"session",indentedSoftWrap:"session",foldStyle:"session",mode:"session"});var E={getText:function(e,t){return(Math.abs(e.selection.lead.row-t)||t+1+(t<9?"\u00b7":""))+""},getWidth:function(e,t,n){return Math.max(t.toString().length,(n.lastRow+1).toString().length,2)*n.characterWidth},update:function(e,t){t.renderer.$loop.schedule(t.renderer.CHANGE_GUTTER)},attach:function(e){e.renderer.$gutterLayer.$renderer=this,e.on("changeSelection",this.update),this.update(null,e)},detach:function(e){e.renderer.$gutterLayer.$renderer==this&&(e.renderer.$gutterLayer.$renderer=null),e.off("changeSelection",this.update),this.update(null,e)}};t.Editor=w}),ace.define("ace/undomanager",["require","exports","module","ace/range"],function(e,t,n){"use strict";function i(e,t){for(var n=t;n--;){var r=e[n];if(r&&!r[0].ignore){while(n0){a.row+=i,a.column+=a.row==r.row?s:0;continue}!t&&l<=0&&(a.row=n.row,a.column=n.column,l===0&&(a.bias=1))}}function f(e){return{row:e.row,column:e.column}}function l(e){return{start:f(e.start),end:f(e.end),action:e.action,lines:e.lines.slice()}}function c(e){e=e||this;if(Array.isArray(e))return e.map(c).join("\n");var t="";e.action?(t=e.action=="insert"?"+":"-",t+="["+e.lines+"]"):e.value&&(Array.isArray(e.value)?t=e.value.map(h).join("\n"):t=h(e.value)),e.start&&(t+=h(e));if(e.id||e.rev)t+=" ("+(e.id||e.rev)+")";return t}function h(e){return e.start.row+":"+e.start.column+"=>"+e.end.row+":"+e.end.column}function p(e,t){var n=e.action=="insert",r=t.action=="insert";if(n&&r)if(o(t.start,e.end)>=0)m(t,e,-1);else{if(!(o(t.start,e.start)<=0))return null;m(e,t,1)}else if(n&&!r)if(o(t.start,e.end)>=0)m(t,e,-1);else{if(!(o(t.end,e.start)<=0))return null;m(e,t,-1)}else if(!n&&r)if(o(t.start,e.start)>=0)m(t,e,1);else{if(!(o(t.start,e.start)<=0))return null;m(e,t,1)}else if(!n&&!r)if(o(t.start,e.start)>=0)m(t,e,1);else{if(!(o(t.end,e.start)<=0))return null;m(e,t,-1)}return[t,e]}function d(e,t){for(var n=e.length;n--;)for(var r=0;r=0?m(e,t,-1):o(e.start,t.start)<=0?m(t,e,1):(m(e,s.fromPoints(t.start,e.start),-1),m(t,e,1));else if(!n&&r)o(t.start,e.end)>=0?m(t,e,-1):o(t.start,e.start)<=0?m(e,t,1):(m(t,s.fromPoints(e.start,t.start),-1),m(e,t,1));else if(!n&&!r)if(o(t.start,e.end)>=0)m(t,e,-1);else{if(!(o(t.end,e.start)<=0)){var i,u;return o(e.start,t.start)<0&&(i=e,e=y(e,t.start)),o(e.end,t.end)>0&&(u=y(e,t.end)),g(t.end,e.start,e.end,-1),u&&!i&&(e.lines=u.lines,e.start=u.start,e.end=u.end,u=e),[t,i,u].filter(Boolean)}m(e,t,-1)}return[t,e]}function m(e,t,n){g(e.start,t.start,t.end,n),g(e.end,t.start,t.end,n)}function g(e,t,n,r){e.row==(r==1?t:n).row&&(e.column+=r*(n.column-t.column)),e.row+=r*(n.row-t.row)}function y(e,t){var n=e.lines,r=e.end;e.end=f(t);var i=e.end.row-e.start.row,s=n.splice(i,n.length),o=i?t.column:t.column-e.start.column;n.push(s[0].substring(0,o)),s[0]=s[0].substr(o);var u={start:f(t),end:r,lines:s,action:e.action};return u}function b(e,t){t=l(t);for(var n=e.length;n--;){var r=e[n];for(var i=0;i0},this.canRedo=function(){return this.$redoStack.length>0},this.bookmark=function(e){e==undefined&&(e=this.$rev),this.mark=e},this.isAtBookmark=function(){return this.$rev===this.mark},this.toJSON=function(){},this.fromJSON=function(){},this.hasUndo=this.canUndo,this.hasRedo=this.canRedo,this.isClean=this.isAtBookmark,this.markClean=this.bookmark,this.$prettyPrint=function(e){return e?c(e):c(this.$undoStack)+"\n---\n"+c(this.$redoStack)}}).call(r.prototype);var s=e("./range").Range,o=s.comparePoints,u=s.comparePoints;t.UndoManager=r}),ace.define("ace/layer/lines",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../lib/dom"),i=function(e,t){this.element=e,this.canvasHeight=t||5e5,this.element.style.height=this.canvasHeight*2+"px",this.cells=[],this.cellCache=[],this.$offsetCoefficient=0};(function(){this.moveContainer=function(e){r.translate(this.element,0,-(e.firstRowScreen*e.lineHeight%this.canvasHeight)-e.offset*this.$offsetCoefficient)},this.pageChanged=function(e,t){return Math.floor(e.firstRowScreen*e.lineHeight/this.canvasHeight)!==Math.floor(t.firstRowScreen*t.lineHeight/this.canvasHeight)},this.computeLineTop=function(e,t,n){var r=t.firstRowScreen*t.lineHeight,i=Math.floor(r/this.canvasHeight),s=n.documentToScreenRow(e,0)*t.lineHeight;return s-i*this.canvasHeight},this.computeLineHeight=function(e,t,n){return t.lineHeight*n.getRowLength(e)},this.getLength=function(){return this.cells.length},this.get=function(e){return this.cells[e]},this.shift=function(){this.$cacheCell(this.cells.shift())},this.pop=function(){this.$cacheCell(this.cells.pop())},this.push=function(e){if(Array.isArray(e)){this.cells.push.apply(this.cells,e);var t=r.createFragment(this.element);for(var n=0;ns&&(a=i.end.row+1,i=t.getNextFoldLine(a,i),s=i?i.start.row:Infinity);if(a>r){while(this.$lines.getLength()>u+1)this.$lines.pop();break}o=this.$lines.get(++u),o?o.row=a:(o=this.$lines.createCell(a,e,this.session,f),this.$lines.push(o)),this.$renderCell(o,e,i,a),a++}this._signal("afterRender"),this.$updateGutterWidth(e)},this.$updateGutterWidth=function(e){var t=this.session,n=t.gutterRenderer||this.$renderer,r=t.$firstLineNumber,i=this.$lines.last()?this.$lines.last().text:"";if(this.$fixedWidth||t.$useWrapMode)i=t.getLength()+r-1;var s=n?n.getWidth(t,i,e):i.toString().length*e.characterWidth,o=this.$padding||this.$computePadding();s+=o.left+o.right,s!==this.gutterWidth&&!isNaN(s)&&(this.gutterWidth=s,this.element.parentNode.style.width=this.element.style.width=Math.ceil(this.gutterWidth)+"px",this._signal("changeGutterWidth",s))},this.$updateCursorRow=function(){if(!this.$highlightGutterLine)return;var e=this.session.selection.getCursor();if(this.$cursorRow===e.row)return;this.$cursorRow=e.row},this.updateLineHighlight=function(){if(!this.$highlightGutterLine)return;var e=this.session.selection.cursor.row;this.$cursorRow=e;if(this.$cursorCell&&this.$cursorCell.row==e)return;this.$cursorCell&&(this.$cursorCell.element.className=this.$cursorCell.element.className.replace("ace_gutter-active-line ",""));var t=this.$lines.cells;this.$cursorCell=null;for(var n=0;n=this.$cursorRow){if(r.row>this.$cursorRow){var i=this.session.getFoldLine(this.$cursorRow);if(!(n>0&&i&&i.start.row==t[n-1].row))break;r=t[n-1]}r.element.className="ace_gutter-active-line "+r.element.className,this.$cursorCell=r;break}}},this.scrollLines=function(e){var t=this.config;this.config=e,this.$updateCursorRow();if(this.$lines.pageChanged(t,e))return this.update(e);this.$lines.moveContainer(e);var n=Math.min(e.lastRow+e.gutterOffset,this.session.getLength()-1),r=this.oldLastRow;this.oldLastRow=n;if(!t||r0;i--)this.$lines.shift();if(r>n)for(var i=this.session.getFoldedRowCount(n+1,r);i>0;i--)this.$lines.pop();e.firstRowr&&this.$lines.push(this.$renderLines(e,r+1,n)),this.updateLineHighlight(),this._signal("afterRender"),this.$updateGutterWidth(e)},this.$renderLines=function(e,t,n){var r=[],i=t,s=this.session.getNextFoldLine(i),o=s?s.start.row:Infinity;for(;;){i>o&&(i=s.end.row+1,s=this.session.getNextFoldLine(i,s),o=s?s.start.row:Infinity);if(i>n)break;var u=this.$lines.createCell(i,e,this.session,f);this.$renderCell(u,e,s,i),r.push(u),i++}return r},this.$renderCell=function(e,t,n,i){var s=e.element,o=this.session,u=s.childNodes[0],a=s.childNodes[1],f=o.$firstLineNumber,l=o.$breakpoints,c=o.$decorations,h=o.gutterRenderer||this.$renderer,p=this.$showFoldWidgets&&o.foldWidgets,d=n?n.start.row:Number.MAX_VALUE,v="ace_gutter-cell ";this.$highlightGutterLine&&(i==this.$cursorRow||n&&i=d&&this.$cursorRow<=n.end.row)&&(v+="ace_gutter-active-line ",this.$cursorCell!=e&&(this.$cursorCell&&(this.$cursorCell.element.className=this.$cursorCell.element.className.replace("ace_gutter-active-line ","")),this.$cursorCell=e)),l[i]&&(v+=l[i]),c[i]&&(v+=c[i]),this.$annotations[i]&&(v+=this.$annotations[i].className),s.className!=v&&(s.className=v);if(p){var m=p[i];m==null&&(m=p[i]=o.getFoldWidget(i))}if(m){var v="ace_fold-widget ace_"+m;m=="start"&&i==d&&in.right-t.right)return"foldWidgets"}}).call(a.prototype),t.Gutter=a}),ace.define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../range").Range,i=e("../lib/dom"),s=function(e){this.element=i.createElement("div"),this.element.className="ace_layer ace_marker-layer",e.appendChild(this.element)};(function(){function e(e,t,n,r){return(e?1:0)|(t?2:0)|(n?4:0)|(r?8:0)}this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setMarkers=function(e){this.markers=e},this.elt=function(e,t){var n=this.i!=-1&&this.element.childNodes[this.i];n?this.i++:(n=document.createElement("div"),this.element.appendChild(n),this.i=-1),n.style.cssText=t,n.className=e},this.update=function(e){if(!e)return;this.config=e,this.i=0;var t;for(var n in this.markers){var r=this.markers[n];if(!r.range){r.update(t,this,this.session,e);continue}var i=r.range.clipRows(e.firstRow,e.lastRow);if(i.isEmpty())continue;i=i.toScreenRange(this.session);if(r.renderer){var s=this.$getTop(i.start.row,e),o=this.$padding+i.start.column*e.characterWidth;r.renderer(t,i,o,s,e)}else r.type=="fullLine"?this.drawFullLineMarker(t,i,r.clazz,e):r.type=="screenLine"?this.drawScreenLineMarker(t,i,r.clazz,e):i.isMultiLine()?r.type=="text"?this.drawTextMarker(t,i,r.clazz,e):this.drawMultiLineMarker(t,i,r.clazz,e):this.drawSingleLineMarker(t,i,r.clazz+" ace_start"+" ace_br15",e)}if(this.i!=-1)while(this.ip,l==f),s,l==f?0:1,o)},this.drawMultiLineMarker=function(e,t,n,r,i){var s=this.$padding,o=r.lineHeight,u=this.$getTop(t.start.row,r),a=s+t.start.column*r.characterWidth;i=i||"";if(this.session.$bidiHandler.isBidiRow(t.start.row)){var f=t.clone();f.end.row=f.start.row,f.end.column=this.session.getLine(f.start.row).length,this.drawBidiSingleLineMarker(e,f,n+" ace_br1 ace_start",r,null,i)}else this.elt(n+" ace_br1 ace_start","height:"+o+"px;"+"right:0;"+"top:"+u+"px;left:"+a+"px;"+(i||""));if(this.session.$bidiHandler.isBidiRow(t.end.row)){var f=t.clone();f.start.row=f.end.row,f.start.column=0,this.drawBidiSingleLineMarker(e,f,n+" ace_br12",r,null,i)}else{u=this.$getTop(t.end.row,r);var l=t.end.column*r.characterWidth;this.elt(n+" ace_br12","height:"+o+"px;"+"width:"+l+"px;"+"top:"+u+"px;"+"left:"+s+"px;"+(i||""))}o=(t.end.row-t.start.row-1)*r.lineHeight;if(o<=0)return;u=this.$getTop(t.start.row+1,r);var c=(t.start.column?1:0)|(t.end.column?0:8);this.elt(n+(c?" ace_br"+c:""),"height:"+o+"px;"+"right:0;"+"top:"+u+"px;"+"left:"+s+"px;"+(i||""))},this.drawSingleLineMarker=function(e,t,n,r,i,s){if(this.session.$bidiHandler.isBidiRow(t.start.row))return this.drawBidiSingleLineMarker(e,t,n,r,i,s);var o=r.lineHeight,u=(t.end.column+(i||0)-t.start.column)*r.characterWidth,a=this.$getTop(t.start.row,r),f=this.$padding+t.start.column*r.characterWidth;this.elt(n,"height:"+o+"px;"+"width:"+u+"px;"+"top:"+a+"px;"+"left:"+f+"px;"+(s||""))},this.drawBidiSingleLineMarker=function(e,t,n,r,i,s){var o=r.lineHeight,u=this.$getTop(t.start.row,r),a=this.$padding,f=this.session.$bidiHandler.getSelections(t.start.column,t.end.column);f.forEach(function(e){this.elt(n,"height:"+o+"px;"+"width:"+e.width+(i||0)+"px;"+"top:"+u+"px;"+"left:"+(a+e.left)+"px;"+(s||""))},this)},this.drawFullLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;t.start.row!=t.end.row&&(o+=this.$getTop(t.end.row,r)-s),this.elt(n,"height:"+o+"px;"+"top:"+s+"px;"+"left:0;right:0;"+(i||""))},this.drawScreenLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;this.elt(n,"height:"+o+"px;"+"top:"+s+"px;"+"left:0;right:0;"+(i||""))}}).call(s.prototype),t.Marker=s}),ace.define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/layer/lines","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("./lines").Lines,u=e("../lib/event_emitter").EventEmitter,a=function(e){this.dom=i,this.element=this.dom.createElement("div"),this.element.className="ace_layer ace_text-layer",e.appendChild(this.element),this.$updateEolChar=this.$updateEolChar.bind(this),this.$lines=new o(this.element)};(function(){r.implement(this,u),this.EOF_CHAR="\u00b6",this.EOL_CHAR_LF="\u00ac",this.EOL_CHAR_CRLF="\u00a4",this.EOL_CHAR=this.EOL_CHAR_LF,this.TAB_CHAR="\u2014",this.SPACE_CHAR="\u00b7",this.$padding=0,this.MAX_LINE_LENGTH=1e4,this.$updateEolChar=function(){var e=this.session.doc,t=e.getNewLineCharacter()=="\n"&&e.getNewLineMode()!="windows",n=t?this.EOL_CHAR_LF:this.EOL_CHAR_CRLF;if(this.EOL_CHAR!=n)return this.EOL_CHAR=n,!0},this.setPadding=function(e){this.$padding=e,this.element.style.margin="0 "+e+"px"},this.getLineHeight=function(){return this.$fontMetrics.$characterSize.height||0},this.getCharacterWidth=function(){return this.$fontMetrics.$characterSize.width||0},this.$setFontMetrics=function(e){this.$fontMetrics=e,this.$fontMetrics.on("changeCharacterSize",function(e){this._signal("changeCharacterSize",e)}.bind(this)),this.$pollSizeChanges()},this.checkForSizeChanges=function(){this.$fontMetrics.checkForSizeChanges()},this.$pollSizeChanges=function(){return this.$pollSizeChangesTimer=this.$fontMetrics.$pollSizeChanges()},this.setSession=function(e){this.session=e,e&&this.$computeTabString()},this.showInvisibles=!1,this.setShowInvisibles=function(e){return this.showInvisibles==e?!1:(this.showInvisibles=e,this.$computeTabString(),!0)},this.displayIndentGuides=!0,this.setDisplayIndentGuides=function(e){return this.displayIndentGuides==e?!1:(this.displayIndentGuides=e,this.$computeTabString(),!0)},this.$tabStrings=[],this.onChangeTabSize=this.$computeTabString=function(){var e=this.session.getTabSize();this.tabSize=e;var t=this.$tabStrings=[0];for(var n=1;nl&&(u=a.end.row+1,a=this.session.getNextFoldLine(u,a),l=a?a.start.row:Infinity);if(u>i)break;var c=s[o++];if(c){this.dom.removeChildren(c),this.$renderLine(c,u,u==l?a:!1);var h=e.lineHeight*this.session.getRowLength(u)+"px";c.style.height!=h&&(f=!0,c.style.height=h)}u++}if(f)while(o0;i--)this.$lines.shift();if(t.lastRow>e.lastRow)for(var i=this.session.getFoldedRowCount(e.lastRow+1,t.lastRow);i>0;i--)this.$lines.pop();e.firstRowt.lastRow&&this.$lines.push(this.$renderLinesFragment(e,t.lastRow+1,e.lastRow))},this.$renderLinesFragment=function(e,t,n){var r=[],s=t,o=this.session.getNextFoldLine(s),u=o?o.start.row:Infinity;for(;;){s>u&&(s=o.end.row+1,o=this.session.getNextFoldLine(s,o),u=o?o.start.row:Infinity);if(s>n)break;var a=this.$lines.createCell(s,e,this.session),f=a.element;this.dom.removeChildren(f),i.setStyle(f.style,"height",this.$lines.computeLineHeight(s,e,this.session)+"px"),i.setStyle(f.style,"top",this.$lines.computeLineTop(s,e,this.session)+"px"),this.$renderLine(f,s,s==u?o:!1),this.$useLineGroups()?f.className="ace_line_group":f.className="ace_line",r.push(a),s++}return r},this.update=function(e){this.$lines.moveContainer(e),this.config=e;var t=e.firstRow,n=e.lastRow,r=this.$lines;while(r.getLength())r.pop();r.push(this.$renderLinesFragment(e,t,n))},this.$textToken={text:!0,rparen:!0,lparen:!0},this.$renderToken=function(e,t,n,r){var i=this,o=/(\t)|( +)|([\x00-\x1f\x80-\xa0\xad\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\uFEFF\uFFF9-\uFFFC]+)|(\u3000)|([\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3001-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]|[\uD800-\uDBFF][\uDC00-\uDFFF])/g,u=this.dom.createFragment(this.element),a,f=0;while(a=o.exec(r)){var l=a[1],c=a[2],h=a[3],p=a[4],d=a[5];if(!i.showInvisibles&&c)continue;var v=f!=a.index?r.slice(f,a.index):"";f=a.index+a[0].length,v&&u.appendChild(this.dom.createTextNode(v,this.element));if(l){var m=i.session.getScreenTabSize(t+a.index);u.appendChild(i.$tabStrings[m].cloneNode(!0)),t+=m-1}else if(c)if(i.showInvisibles){var g=this.dom.createElement("span");g.className="ace_invisible ace_invisible_space",g.textContent=s.stringRepeat(i.SPACE_CHAR,c.length),u.appendChild(g)}else u.appendChild(this.com.createTextNode(c,this.element));else if(h){var g=this.dom.createElement("span");g.className="ace_invisible ace_invisible_space ace_invalid",g.textContent=s.stringRepeat(i.SPACE_CHAR,h.length),u.appendChild(g)}else if(p){var y=i.showInvisibles?i.SPACE_CHAR:"";t+=1;var g=this.dom.createElement("span");g.style.width=i.config.characterWidth*2+"px",g.className=i.showInvisibles?"ace_cjk ace_invisible ace_invisible_space":"ace_cjk",g.textContent=i.showInvisibles?i.SPACE_CHAR:"",u.appendChild(g)}else if(d){t+=1;var g=this.dom.createElement("span");g.style.width=i.config.characterWidth*2+"px",g.className="ace_cjk",g.textContent=d,u.appendChild(g)}}u.appendChild(this.dom.createTextNode(f?r.slice(f):r,this.element));if(!this.$textToken[n.type]){var b="ace_"+n.type.replace(/\./g," ace_"),g=this.dom.createElement("span");n.type=="fold"&&(g.style.width=n.value.length*this.config.characterWidth+"px"),g.className=b,g.appendChild(u),e.appendChild(g)}else e.appendChild(u);return t+r.length},this.renderIndentGuide=function(e,t,n){var r=t.search(this.$indentGuideRe);if(r<=0||r>=n)return t;if(t[0]==" "){r-=r%this.tabSize;var i=r/this.tabSize;for(var s=0;s=o)u=this.$renderToken(a,u,l,c.substring(0,o-r)),c=c.substring(o-r),r=o,a=this.$createLineElement(),e.appendChild(a),a.appendChild(this.dom.createTextNode(s.stringRepeat("\u00a0",n.indent),this.element)),i++,u=0,o=n[i]||Number.MAX_VALUE;c.length!=0&&(r+=c.length,u=this.$renderToken(a,u,l,c))}}},this.$renderSimpleLine=function(e,t){var n=0,r=t[0],i=r.value;this.displayIndentGuides&&(i=this.renderIndentGuide(e,i)),i&&(n=this.$renderToken(e,n,r,i));for(var s=1;sthis.MAX_LINE_LENGTH)return this.$renderOverflowMessage(e,n,r,i);n=this.$renderToken(e,n,r,i)}},this.$renderOverflowMessage=function(e,t,n,r){this.$renderToken(e,t,n,r.slice(0,this.MAX_LINE_LENGTH-t));var i=this.dom.createElement("span");i.className="ace_inline_button ace_keyword ace_toggle_wrap",i.style.position="absolute",i.style.right="0",i.textContent="",e.appendChild(i)},this.$renderLine=function(e,t,n){!n&&n!=0&&(n=this.session.getFoldLine(t));if(n)var r=this.$getFoldLineTokens(t,n);else var r=this.session.getTokens(t);var i=e;if(r.length){var s=this.session.getRowSplitData(t);if(s&&s.length){this.$renderWrappedLine(e,r,s);var i=e.lastChild}else{var i=e;this.$useLineGroups()&&(i=this.$createLineElement(),e.appendChild(i)),this.$renderSimpleLine(i,r)}}else this.$useLineGroups()&&(i=this.$createLineElement(),e.appendChild(i));if(this.showInvisibles&&i){n&&(t=n.end.row);var o=this.dom.createElement("span");o.className="ace_invisible ace_invisible_eol",o.textContent=t==this.session.getLength()-1?this.EOF_CHAR:this.EOL_CHAR,i.appendChild(o)}},this.$getFoldLineTokens=function(e,t){function i(e,t,n){var i=0,s=0;while(s+e[i].value.lengthn-t&&(o=o.substring(0,n-t)),r.push({type:e[i].type,value:o}),s=t+o.length,i+=1}while(sn?r.push({type:e[i].type,value:o.substring(0,n-s)}):r.push(e[i]),s+=o.length,i+=1}}var n=this.session,r=[],s=n.getTokens(e);return t.walk(function(e,t,o,u,a){e!=null?r.push({type:"fold",value:e}):(a&&(s=n.getTokens(t)),s.length&&i(s,u,o))},t.end.row,this.session.getLine(t.end.row).length),r},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){}}).call(a.prototype),t.Text=a}),ace.define("ace/layer/cursor",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../lib/dom"),i=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_cursor-layer",e.appendChild(this.element),this.isVisible=!1,this.isBlinking=!0,this.blinkInterval=1e3,this.smoothBlinking=!1,this.cursors=[],this.cursor=this.addCursor(),r.addCssClass(this.element,"ace_hidden-cursors"),this.$updateCursors=this.$updateOpacity.bind(this)};(function(){this.$updateOpacity=function(e){var t=this.cursors;for(var n=t.length;n--;)r.setStyle(t[n].style,"opacity",e?"":"0")},this.$startCssAnimation=function(){var e=this.cursors;for(var t=e.length;t--;)e[t].style.animationDuration=this.blinkInterval+"ms";setTimeout(function(){r.addCssClass(this.element,"ace_animate-blinking")}.bind(this))},this.$stopCssAnimation=function(){r.removeCssClass(this.element,"ace_animate-blinking")},this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setBlinking=function(e){e!=this.isBlinking&&(this.isBlinking=e,this.restartTimer())},this.setBlinkInterval=function(e){e!=this.blinkInterval&&(this.blinkInterval=e,this.restartTimer())},this.setSmoothBlinking=function(e){e!=this.smoothBlinking&&(this.smoothBlinking=e,r.setCssClass(this.element,"ace_smooth-blinking",e),this.$updateCursors(!0),this.restartTimer())},this.addCursor=function(){var e=r.createElement("div");return e.className="ace_cursor",this.element.appendChild(e),this.cursors.push(e),e},this.removeCursor=function(){if(this.cursors.length>1){var e=this.cursors.pop();return e.parentNode.removeChild(e),e}},this.hideCursor=function(){this.isVisible=!1,r.addCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.showCursor=function(){this.isVisible=!0,r.removeCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.restartTimer=function(){var e=this.$updateCursors;clearInterval(this.intervalId),clearTimeout(this.timeoutId),this.$stopCssAnimation(),this.smoothBlinking&&r.removeCssClass(this.element,"ace_smooth-blinking"),e(!0);if(!this.isBlinking||!this.blinkInterval||!this.isVisible){this.$stopCssAnimation();return}this.smoothBlinking&&setTimeout(function(){r.addCssClass(this.element,"ace_smooth-blinking")}.bind(this));if(r.HAS_CSS_ANIMATION)this.$startCssAnimation();else{var t=function(){this.timeoutId=setTimeout(function(){e(!1)},.6*this.blinkInterval)}.bind(this);this.intervalId=setInterval(function(){e(!0),t()},this.blinkInterval),t()}},this.getPixelPosition=function(e,t){if(!this.config||!this.session)return{left:0,top:0};e||(e=this.session.selection.getCursor());var n=this.session.documentToScreenPosition(e),r=this.$padding+(this.session.$bidiHandler.isBidiRow(n.row,e.row)?this.session.$bidiHandler.getPosLeft(n.column):n.column*this.config.characterWidth),i=(n.row-(t?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:r,top:i}},this.isCursorInView=function(e,t){return e.top>=0&&e.tope.height+e.offset||o.top<0)&&n>1)continue;var u=this.cursors[i++]||this.addCursor(),a=u.style;this.drawCursor?this.drawCursor(u,o,e,t[n],this.session):this.isCursorInView(o,e)?(r.setStyle(a,"display","block"),r.translate(u,o.left,o.top),r.setStyle(a,"width",Math.round(e.characterWidth)+"px"),r.setStyle(a,"height",e.lineHeight+"px")):r.setStyle(a,"display","none")}while(this.cursors.length>i)this.removeCursor();var f=this.session.getOverwrite();this.$setOverwrite(f),this.$pixelPos=o,this.restartTimer()},this.drawCursor=null,this.$setOverwrite=function(e){e!=this.overwrite&&(this.overwrite=e,e?r.addCssClass(this.element,"ace_overwrite-cursors"):r.removeCssClass(this.element,"ace_overwrite-cursors"))},this.destroy=function(){clearInterval(this.intervalId),clearTimeout(this.timeoutId)}}).call(i.prototype),t.Cursor=i}),ace.define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./lib/event"),o=e("./lib/event_emitter").EventEmitter,u=32768,a=function(e){this.element=i.createElement("div"),this.element.className="ace_scrollbar ace_scrollbar"+this.classSuffix,this.inner=i.createElement("div"),this.inner.className="ace_scrollbar-inner",this.element.appendChild(this.inner),e.appendChild(this.element),this.setVisible(!1),this.skipEvent=!1,s.addListener(this.element,"scroll",this.onScroll.bind(this)),s.addListener(this.element,"mousedown",s.preventDefault)};(function(){r.implement(this,o),this.setVisible=function(e){this.element.style.display=e?"":"none",this.isVisible=e,this.coeff=1}}).call(a.prototype);var f=function(e,t){a.call(this,e),this.scrollTop=0,this.scrollHeight=0,t.$scrollbarWidth=this.width=i.scrollbarWidth(e.ownerDocument),this.inner.style.width=this.element.style.width=(this.width||15)+5+"px",this.$minWidth=0};r.inherits(f,a),function(){this.classSuffix="-v",this.onScroll=function(){if(!this.skipEvent){this.scrollTop=this.element.scrollTop;if(this.coeff!=1){var e=this.element.clientHeight/this.scrollHeight;this.scrollTop=this.scrollTop*(1-e)/(this.coeff-e)}this._emit("scroll",{data:this.scrollTop})}this.skipEvent=!1},this.getWidth=function(){return Math.max(this.isVisible?this.width:0,this.$minWidth||0)},this.setHeight=function(e){this.element.style.height=e+"px"},this.setInnerHeight=this.setScrollHeight=function(e){this.scrollHeight=e,e>u?(this.coeff=u/e,e=u):this.coeff!=1&&(this.coeff=1),this.inner.style.height=e+"px"},this.setScrollTop=function(e){this.scrollTop!=e&&(this.skipEvent=!0,this.scrollTop=e,this.element.scrollTop=e*this.coeff)}}.call(f.prototype);var l=function(e,t){a.call(this,e),this.scrollLeft=0,this.height=t.$scrollbarWidth,this.inner.style.height=this.element.style.height=(this.height||15)+5+"px"};r.inherits(l,a),function(){this.classSuffix="-h",this.onScroll=function(){this.skipEvent||(this.scrollLeft=this.element.scrollLeft,this._emit("scroll",{data:this.scrollLeft})),this.skipEvent=!1},this.getHeight=function(){return this.isVisible?this.height:0},this.setWidth=function(e){this.element.style.width=e+"px"},this.setInnerWidth=function(e){this.inner.style.width=e+"px"},this.setScrollWidth=function(e){this.inner.style.width=e+"px"},this.setScrollLeft=function(e){this.scrollLeft!=e&&(this.skipEvent=!0,this.scrollLeft=this.element.scrollLeft=e)}}.call(l.prototype),t.ScrollBar=f,t.ScrollBarV=f,t.ScrollBarH=l,t.VScrollBar=f,t.HScrollBar=l}),ace.define("ace/renderloop",["require","exports","module","ace/lib/event"],function(e,t,n){"use strict";var r=e("./lib/event"),i=function(e,t){this.onRender=e,this.pending=!1,this.changes=0,this.$recursionLimit=2,this.window=t||window;var n=this;this._flush=function(e){n.pending=!1;var t=n.changes;t&&(r.blockIdle(100),n.changes=0,n.onRender(t));if(n.changes){if(n.$recursionLimit--<0)return;n.schedule()}else n.$recursionLimit=2}};(function(){this.schedule=function(e){this.changes=this.changes|e,this.changes&&!this.pending&&(r.nextFrame(this._flush),this.pending=!0)},this.clear=function(e){var t=this.changes;return this.changes=0,t}}).call(i.prototype),t.RenderLoop=i}),ace.define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/event","ace/lib/useragent","ace/lib/event_emitter"],function(e,t,n){var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("../lib/event"),u=e("../lib/useragent"),a=e("../lib/event_emitter").EventEmitter,f=256,l=typeof ResizeObserver=="function",c=200,h=t.FontMetrics=function(e){this.el=i.createElement("div"),this.$setMeasureNodeStyles(this.el.style,!0),this.$main=i.createElement("div"),this.$setMeasureNodeStyles(this.$main.style),this.$measureNode=i.createElement("div"),this.$setMeasureNodeStyles(this.$measureNode.style),this.el.appendChild(this.$main),this.el.appendChild(this.$measureNode),e.appendChild(this.el),this.$measureNode.innerHTML=s.stringRepeat("X",f),this.$characterSize={width:0,height:0},l?this.$addObserver():this.checkForSizeChanges()};(function(){r.implement(this,a),this.$characterSize={width:0,height:0},this.$setMeasureNodeStyles=function(e,t){e.width=e.height="auto",e.left=e.top="0px",e.visibility="hidden",e.position="absolute",e.whiteSpace="pre",u.isIE<8?e["font-family"]="inherit":e.font="inherit",e.overflow=t?"hidden":"visible"},this.checkForSizeChanges=function(e){e===undefined&&(e=this.$measureSizes());if(e&&(this.$characterSize.width!==e.width||this.$characterSize.height!==e.height)){this.$measureNode.style.fontWeight="bold";var t=this.$measureSizes();this.$measureNode.style.fontWeight="",this.$characterSize=e,this.charSizes=Object.create(null),this.allowBoldFonts=t&&t.width===e.width&&t.height===e.height,this._emit("changeCharacterSize",{data:e})}},this.$addObserver=function(){var e=this;this.$observer=new window.ResizeObserver(function(t){var n=t[0].contentRect;e.checkForSizeChanges({height:n.height,width:n.width/f})}),this.$observer.observe(this.$measureNode)},this.$pollSizeChanges=function(){if(this.$pollSizeChangesTimer||this.$observer)return this.$pollSizeChangesTimer;var e=this;return this.$pollSizeChangesTimer=o.onIdle(function t(){e.checkForSizeChanges(),o.onIdle(t,500)},500)},this.setPolling=function(e){e?this.$pollSizeChanges():this.$pollSizeChangesTimer&&(clearInterval(this.$pollSizeChangesTimer),this.$pollSizeChangesTimer=0)},this.$measureSizes=function(e){var t={height:(e||this.$measureNode).clientHeight,width:(e||this.$measureNode).clientWidth/f};return t.width===0||t.height===0?null:t},this.$measureCharWidth=function(e){this.$main.innerHTML=s.stringRepeat(e,f);var t=this.$main.getBoundingClientRect();return t.width/f},this.getCharacterWidth=function(e){var t=this.charSizes[e];return t===undefined&&(t=this.charSizes[e]=this.$measureCharWidth(e)/this.$characterSize.width),t},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$observer&&this.$observer.disconnect(),this.el&&this.el.parentNode&&this.el.parentNode.removeChild(this.el)},this.$getZoom=function e(t){return t?(window.getComputedStyle(t).zoom||1)*e(t.parentElement):1},this.$initTransformMeasureNodes=function(){var e=function(e,t){return["div",{style:"position: absolute;top:"+e+"px;left:"+t+"px;"}]};this.els=i.buildDom([e(0,0),e(c,0),e(0,c),e(c,c)],this.el)},this.transformCoordinates=function(e,t){function r(e,t,n){var r=e[1]*t[0]-e[0]*t[1];return[(-t[1]*n[0]+t[0]*n[1])/r,(+e[1]*n[0]-e[0]*n[1])/r]}function i(e,t){return[e[0]-t[0],e[1]-t[1]]}function s(e,t){return[e[0]+t[0],e[1]+t[1]]}function o(e,t){return[e*t[0],e*t[1]]}function u(e){var t=e.getBoundingClientRect();return[t.left,t.top]}if(e){var n=this.$getZoom(this.el);e=o(1/n,e)}this.els||this.$initTransformMeasureNodes();var a=u(this.els[0]),f=u(this.els[1]),l=u(this.els[2]),h=u(this.els[3]),p=r(i(h,f),i(h,l),i(s(f,l),s(h,a))),d=o(1+p[0],i(f,a)),v=o(1+p[1],i(l,a));if(t){var m=t,g=p[0]*m[0]/c+p[1]*m[1]/c+1,y=s(o(m[0],d),o(m[1],v));return s(o(1/g/c,y),a)}var b=i(e,a),w=r(i(d,o(p[0],b)),i(v,o(p[1],b)),b);return o(c,w)}}).call(h.prototype)}),ace.define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter","ace/lib/useragent"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./config"),o=e("./layer/gutter").Gutter,u=e("./layer/marker").Marker,a=e("./layer/text").Text,f=e("./layer/cursor").Cursor,l=e("./scrollbar").HScrollBar,c=e("./scrollbar").VScrollBar,h=e("./renderloop").RenderLoop,p=e("./layer/font_metrics").FontMetrics,d=e("./lib/event_emitter").EventEmitter,v='.ace_br1 {border-top-left-radius : 3px;}.ace_br2 {border-top-right-radius : 3px;}.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}.ace_br4 {border-bottom-right-radius: 3px;}.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}.ace_br8 {border-bottom-left-radius : 3px;}.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_editor {position: relative;overflow: hidden;font: 12px/normal \'Monaco\', \'Menlo\', \'Ubuntu Mono\', \'Consolas\', \'source-code-pro\', monospace;direction: ltr;text-align: left;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);}.ace_scroller {position: absolute;overflow: hidden;top: 0;bottom: 0;background-color: inherit;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;cursor: text;}.ace_content {position: absolute;box-sizing: border-box;min-width: 100%;contain: style size layout;}.ace_dragging .ace_scroller:before{position: absolute;top: 0;left: 0;right: 0;bottom: 0;content: \'\';background: rgba(250, 250, 250, 0.01);z-index: 1000;}.ace_dragging.ace_dark .ace_scroller:before{background: rgba(0, 0, 0, 0.01);}.ace_selecting, .ace_selecting * {cursor: text !important;}.ace_gutter {position: absolute;overflow : hidden;width: auto;top: 0;bottom: 0;left: 0;cursor: default;z-index: 4;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;contain: style size layout;}.ace_gutter-active-line {position: absolute;left: 0;right: 0;}.ace_scroller.ace_scroll-left {box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;}.ace_gutter-cell {position: absolute;top: 0;left: 0;right: 0;padding-left: 19px;padding-right: 6px;background-repeat: no-repeat;}.ace_gutter-cell.ace_error {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: 2px center;}.ace_gutter-cell.ace_warning {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==");background-position: 2px center;}.ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=");background-position: 2px center;}.ace_dark .ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC");}.ace_scrollbar {contain: strict;position: absolute;right: 0;bottom: 0;z-index: 6;}.ace_scrollbar-inner {position: absolute;cursor: text;left: 0;top: 0;}.ace_scrollbar-v{overflow-x: hidden;overflow-y: scroll;top: 0;}.ace_scrollbar-h {overflow-x: scroll;overflow-y: hidden;left: 0;}.ace_print-margin {position: absolute;height: 100%;}.ace_text-input {position: absolute;z-index: 0;width: 0.5em;height: 1em;opacity: 0;background: transparent;-moz-appearance: none;appearance: none;border: none;resize: none;outline: none;overflow: hidden;font: inherit;padding: 0 1px;margin: 0 -1px;contain: strict;-ms-user-select: text;-moz-user-select: text;-webkit-user-select: text;user-select: text;white-space: pre!important;}.ace_text-input.ace_composition {background: transparent;color: inherit;z-index: 1000;opacity: 1;}.ace_composition_placeholder { color: transparent }.ace_composition_marker { border-bottom: 1px solid;position: absolute;border-radius: 0;margin-top: 1px;}[ace_nocontext=true] {transform: none!important;filter: none!important;perspective: none!important;clip-path: none!important;mask : none!important;contain: none!important;perspective: none!important;mix-blend-mode: initial!important;z-index: auto;}.ace_layer {z-index: 1;position: absolute;overflow: hidden;word-wrap: normal;white-space: pre;height: 100%;width: 100%;box-sizing: border-box;pointer-events: none;}.ace_gutter-layer {position: relative;width: auto;text-align: right;pointer-events: auto;height: 1000000px;contain: style size layout;}.ace_text-layer {font: inherit !important;position: absolute;height: 1000000px;width: 1000000px;contain: style size layout;}.ace_text-layer > .ace_line, .ace_text-layer > .ace_line_group {contain: style size layout;position: absolute;top: 0;left: 0;right: 0;}.ace_hidpi .ace_text-layer,.ace_hidpi .ace_gutter-layer,.ace_hidpi .ace_content,.ace_hidpi .ace_gutter {contain: strict;will-change: transform;}.ace_hidpi .ace_text-layer > .ace_line, .ace_hidpi .ace_text-layer > .ace_line_group {contain: strict;}.ace_cjk {display: inline-block;text-align: center;}.ace_cursor-layer {z-index: 4;}.ace_cursor {z-index: 4;position: absolute;box-sizing: border-box;border-left: 2px solid;transform: translatez(0);}.ace_multiselect .ace_cursor {border-left-width: 1px;}.ace_slim-cursors .ace_cursor {border-left-width: 1px;}.ace_overwrite-cursors .ace_cursor {border-left-width: 0;border-bottom: 1px solid;}.ace_hidden-cursors .ace_cursor {opacity: 0.2;}.ace_smooth-blinking .ace_cursor {transition: opacity 0.18s;}.ace_animate-blinking .ace_cursor {animation-duration: 1000ms;animation-timing-function: step-end;animation-name: blink-ace-animate;animation-iteration-count: infinite;}.ace_animate-blinking.ace_smooth-blinking .ace_cursor {animation-duration: 1000ms;animation-timing-function: ease-in-out;animation-name: blink-ace-animate-smooth;}@keyframes blink-ace-animate {from, to { opacity: 1; }60% { opacity: 0; }}@keyframes blink-ace-animate-smooth {from, to { opacity: 1; }45% { opacity: 1; }60% { opacity: 0; }85% { opacity: 0; }}.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {position: absolute;z-index: 3;}.ace_marker-layer .ace_selection {position: absolute;z-index: 5;}.ace_marker-layer .ace_bracket {position: absolute;z-index: 6;}.ace_marker-layer .ace_active-line {position: absolute;z-index: 2;}.ace_marker-layer .ace_selected-word {position: absolute;z-index: 4;box-sizing: border-box;}.ace_line .ace_fold {box-sizing: border-box;display: inline-block;height: 11px;margin-top: -2px;vertical-align: middle;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=");background-repeat: no-repeat, repeat-x;background-position: center center, top left;color: transparent;border: 1px solid black;border-radius: 2px;cursor: pointer;pointer-events: auto;}.ace_dark .ace_fold {}.ace_fold:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC");}.ace_tooltip {background-color: #FFF;background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));border: 1px solid gray;border-radius: 1px;box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);color: black;max-width: 100%;padding: 3px 4px;position: fixed;z-index: 999999;box-sizing: border-box;cursor: default;white-space: pre;word-wrap: break-word;line-height: normal;font-style: normal;font-weight: normal;letter-spacing: normal;pointer-events: none;}.ace_folding-enabled > .ace_gutter-cell {padding-right: 13px;}.ace_fold-widget {box-sizing: border-box;margin: 0 -12px 0 1px;display: none;width: 11px;vertical-align: top;background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: center;border-radius: 3px;border: 1px solid transparent;cursor: pointer;}.ace_folding-enabled .ace_fold-widget {display: inline-block; }.ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==");}.ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==");}.ace_fold-widget:hover {border: 1px solid rgba(0, 0, 0, 0.3);background-color: rgba(255, 255, 255, 0.2);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);}.ace_fold-widget:active {border: 1px solid rgba(0, 0, 0, 0.4);background-color: rgba(0, 0, 0, 0.05);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);}.ace_dark .ace_fold-widget {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC");}.ace_dark .ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget:hover {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);background-color: rgba(255, 255, 255, 0.1);}.ace_dark .ace_fold-widget:active {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);}.ace_inline_button {border: 1px solid lightgray;display: inline-block;margin: -1px 8px;padding: 0 5px;pointer-events: auto;cursor: pointer;}.ace_inline_button:hover {border-color: gray;background: rgba(200,200,200,0.2);display: inline-block;pointer-events: auto;}.ace_fold-widget.ace_invalid {background-color: #FFB4B4;border-color: #DE5555;}.ace_fade-fold-widgets .ace_fold-widget {transition: opacity 0.4s ease 0.05s;opacity: 0;}.ace_fade-fold-widgets:hover .ace_fold-widget {transition: opacity 0.05s ease 0.05s;opacity:1;}.ace_underline {text-decoration: underline;}.ace_bold {font-weight: bold;}.ace_nobold .ace_bold {font-weight: normal;}.ace_italic {font-style: italic;}.ace_error-marker {background-color: rgba(255, 0, 0,0.2);position: absolute;z-index: 9;}.ace_highlight-marker {background-color: rgba(255, 255, 0,0.2);position: absolute;z-index: 8;}',m=e("./lib/useragent"),g=m.isIE;i.importCssString(v,"ace_editor.css");var y=function(e,t){var n=this;this.container=e||i.createElement("div"),i.addCssClass(this.container,"ace_editor"),i.HI_DPI&&i.addCssClass(this.container,"ace_hidpi"),this.setTheme(t),this.$gutter=i.createElement("div"),this.$gutter.className="ace_gutter",this.container.appendChild(this.$gutter),this.$gutter.setAttribute("aria-hidden",!0),this.scroller=i.createElement("div"),this.scroller.className="ace_scroller",this.container.appendChild(this.scroller),this.content=i.createElement("div"),this.content.className="ace_content",this.scroller.appendChild(this.content),this.$gutterLayer=new o(this.$gutter),this.$gutterLayer.on("changeGutterWidth",this.onGutterResize.bind(this)),this.$markerBack=new u(this.content);var r=this.$textLayer=new a(this.content);this.canvas=r.element,this.$markerFront=new u(this.content),this.$cursorLayer=new f(this.content),this.$horizScroll=!1,this.$vScroll=!1,this.scrollBar=this.scrollBarV=new c(this.container,this),this.scrollBarH=new l(this.container,this),this.scrollBarV.addEventListener("scroll",function(e){n.$scrollAnimation||n.session.setScrollTop(e.data-n.scrollMargin.top)}),this.scrollBarH.addEventListener("scroll",function(e){n.$scrollAnimation||n.session.setScrollLeft(e.data-n.scrollMargin.left)}),this.scrollTop=0,this.scrollLeft=0,this.cursorPos={row:0,column:0},this.$fontMetrics=new p(this.container),this.$textLayer.$setFontMetrics(this.$fontMetrics),this.$textLayer.addEventListener("changeCharacterSize",function(e){n.updateCharacterSize(),n.onResize(!0,n.gutterWidth,n.$size.width,n.$size.height),n._signal("changeCharacterSize",e)}),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0,$dirty:!0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:0,characterWidth:0,minHeight:1,maxHeight:1,offset:0,height:1,gutterOffset:1},this.scrollMargin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.margin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.$keepTextAreaAtCursor=!m.isIOS,this.$loop=new h(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView),this.$loop.schedule(this.CHANGE_FULL),this.updateCharacterSize(),this.setPadding(4),s.resetOptions(this),s._emit("renderer",this)};(function(){this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,this.CHANGE_H_SCROLL=1024,r.implement(this,d),this.updateCharacterSize=function(){this.$textLayer.allowBoldFonts!=this.$allowBoldFonts&&(this.$allowBoldFonts=this.$textLayer.allowBoldFonts,this.setStyle("ace_nobold",!this.$allowBoldFonts)),this.layerConfig.characterWidth=this.characterWidth=this.$textLayer.getCharacterWidth(),this.layerConfig.lineHeight=this.lineHeight=this.$textLayer.getLineHeight(),this.$updatePrintMargin()},this.setSession=function(e){this.session&&this.session.doc.off("changeNewLineMode",this.onChangeNewLineMode),this.session=e,e&&this.scrollMargin.top&&e.getScrollTop()<=0&&e.setScrollTop(-this.scrollMargin.top),this.$cursorLayer.setSession(e),this.$markerBack.setSession(e),this.$markerFront.setSession(e),this.$gutterLayer.setSession(e),this.$textLayer.setSession(e);if(!e)return;this.$loop.schedule(this.CHANGE_FULL),this.session.$setFontMetrics(this.$fontMetrics),this.scrollBarH.scrollLeft=this.scrollBarV.scrollTop=null,this.onChangeNewLineMode=this.onChangeNewLineMode.bind(this),this.onChangeNewLineMode(),this.session.doc.on("changeNewLineMode",this.onChangeNewLineMode)},this.updateLines=function(e,t,n){t===undefined&&(t=Infinity),this.$changedLines?(this.$changedLines.firstRow>e&&(this.$changedLines.firstRow=e),this.$changedLines.lastRowthis.layerConfig.lastRow)return;this.$loop.schedule(this.CHANGE_LINES)},this.onChangeNewLineMode=function(){this.$loop.schedule(this.CHANGE_TEXT),this.$textLayer.$updateEolChar(),this.session.$bidiHandler.setEolChar(this.$textLayer.EOL_CHAR)},this.onChangeTabSize=function(){this.$loop.schedule(this.CHANGE_TEXT|this.CHANGE_MARKER),this.$textLayer.onChangeTabSize()},this.updateText=function(){this.$loop.schedule(this.CHANGE_TEXT)},this.updateFull=function(e){e?this.$renderChanges(this.CHANGE_FULL,!0):this.$loop.schedule(this.CHANGE_FULL)},this.updateFontSize=function(){this.$textLayer.checkForSizeChanges()},this.$changes=0,this.$updateSizeAsync=function(){this.$loop.pending?this.$size.$dirty=!0:this.onResize()},this.onResize=function(e,t,n,r){if(this.resizing>2)return;this.resizing>0?this.resizing++:this.resizing=e?1:0;var i=this.container;r||(r=i.clientHeight||i.scrollHeight),n||(n=i.clientWidth||i.scrollWidth);var s=this.$updateCachedSize(e,t,n,r);if(!this.$size.scrollerHeight||!n&&!r)return this.resizing=0;e&&(this.$gutterLayer.$padding=null),e?this.$renderChanges(s|this.$changes,!0):this.$loop.schedule(s|this.$changes),this.resizing&&(this.resizing=0),this.scrollBarV.scrollLeft=this.scrollBarV.scrollTop=null},this.$updateCachedSize=function(e,t,n,r){r-=this.$extraHeight||0;var s=0,o=this.$size,u={width:o.width,height:o.height,scrollerHeight:o.scrollerHeight,scrollerWidth:o.scrollerWidth};r&&(e||o.height!=r)&&(o.height=r,s|=this.CHANGE_SIZE,o.scrollerHeight=o.height,this.$horizScroll&&(o.scrollerHeight-=this.scrollBarH.getHeight()),this.scrollBarV.element.style.bottom=this.scrollBarH.getHeight()+"px",s|=this.CHANGE_SCROLL);if(n&&(e||o.width!=n)){s|=this.CHANGE_SIZE,o.width=n,t==null&&(t=this.$showGutter?this.$gutter.offsetWidth:0),this.gutterWidth=t,i.setStyle(this.scrollBarH.element.style,"left",t+"px"),i.setStyle(this.scroller.style,"left",t+this.margin.left+"px"),o.scrollerWidth=Math.max(0,n-t-this.scrollBarV.getWidth()-this.margin.h),i.setStyle(this.$gutter.style,"left",this.margin.left+"px");var a=this.scrollBarV.getWidth()+"px";i.setStyle(this.scrollBarH.element.style,"right",a),i.setStyle(this.scroller.style,"right",a),i.setStyle(this.scroller.style,"bottom",this.scrollBarH.getHeight());if(this.session&&this.session.getUseWrapMode()&&this.adjustWrapLimit()||e)s|=this.CHANGE_FULL}return o.$dirty=!n||!r,s&&this._signal("resize",u),s},this.onGutterResize=function(e){var t=this.$showGutter?e:0;t!=this.gutterWidth&&(this.$changes|=this.$updateCachedSize(!0,t,this.$size.width,this.$size.height)),this.session.getUseWrapMode()&&this.adjustWrapLimit()?this.$loop.schedule(this.CHANGE_FULL):this.$size.$dirty?this.$loop.schedule(this.CHANGE_FULL):this.$computeLayerConfig()},this.adjustWrapLimit=function(){var e=this.$size.scrollerWidth-this.$padding*2,t=Math.floor(e/this.characterWidth);return this.session.adjustWrapLimit(t,this.$showPrintMargin&&this.$printMarginColumn)},this.setAnimatedScroll=function(e){this.setOption("animatedScroll",e)},this.getAnimatedScroll=function(){return this.$animatedScroll},this.setShowInvisibles=function(e){this.setOption("showInvisibles",e),this.session.$bidiHandler.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.getOption("showInvisibles")},this.getDisplayIndentGuides=function(){return this.getOption("displayIndentGuides")},this.setDisplayIndentGuides=function(e){this.setOption("displayIndentGuides",e)},this.setShowPrintMargin=function(e){this.setOption("showPrintMargin",e)},this.getShowPrintMargin=function(){return this.getOption("showPrintMargin")},this.setPrintMarginColumn=function(e){this.setOption("printMarginColumn",e)},this.getPrintMarginColumn=function(){return this.getOption("printMarginColumn")},this.getShowGutter=function(){return this.getOption("showGutter")},this.setShowGutter=function(e){return this.setOption("showGutter",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.$updatePrintMargin=function(){if(!this.$showPrintMargin&&!this.$printMarginEl)return;if(!this.$printMarginEl){var e=i.createElement("div");e.className="ace_layer ace_print-margin-layer",this.$printMarginEl=i.createElement("div"),this.$printMarginEl.className="ace_print-margin",e.appendChild(this.$printMarginEl),this.content.insertBefore(e,this.content.firstChild)}var t=this.$printMarginEl.style;t.left=Math.round(this.characterWidth*this.$printMarginColumn+this.$padding)+"px",t.visibility=this.$showPrintMargin?"visible":"hidden",this.session&&this.session.$wrap==-1&&this.adjustWrapLimit()},this.getContainerElement=function(){return this.container},this.getMouseEventTarget=function(){return this.scroller},this.getTextAreaContainer=function(){return this.container},this.$moveTextAreaToCursor=function(){var e=this.textarea.style;if(!this.$keepTextAreaAtCursor){i.translate(this.textarea,-100,0);return}var t=this.$cursorLayer.$pixelPos;if(!t)return;var n=this.$composition;n&&n.markerRange&&(t=this.$cursorLayer.getPixelPosition(n.markerRange.start,!0));var r=this.layerConfig,s=t.top,o=t.left;s-=r.offset;var u=n&&n.useTextareaForIME?this.lineHeight:g?0:1;if(s<0||s>r.height-u){i.translate(this.textarea,0,0);return}var a=1;if(!n)s+=this.lineHeight;else if(n.useTextareaForIME){var f=this.textarea.value;a=this.characterWidth*this.session.$getStringScreenWidth(f)[0],u+=2}else s+=this.lineHeight+2;o-=this.scrollLeft,o>this.$size.scrollerWidth-a&&(o=this.$size.scrollerWidth-a),o+=this.gutterWidth+this.margin.left,i.setStyle(e,"height",u+"px"),i.setStyle(e,"width",a+"px"),i.translate(this.textarea,Math.min(o,this.$size.scrollerWidth-a),Math.min(s,this.$size.height-u))},this.getFirstVisibleRow=function(){return this.layerConfig.firstRow},this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(this.layerConfig.offset===0?0:1)},this.getLastFullyVisibleRow=function(){var e=this.layerConfig,t=e.lastRow,n=this.session.documentToScreenRow(t,0)*e.lineHeight;return n-this.session.getScrollTop()>e.height-e.lineHeight?t-1:t},this.getLastVisibleRow=function(){return this.layerConfig.lastRow},this.$padding=null,this.setPadding=function(e){this.$padding=e,this.$textLayer.setPadding(e),this.$cursorLayer.setPadding(e),this.$markerFront.setPadding(e),this.$markerBack.setPadding(e),this.$loop.schedule(this.CHANGE_FULL),this.$updatePrintMargin()},this.setScrollMargin=function(e,t,n,r){var i=this.scrollMargin;i.top=e|0,i.bottom=t|0,i.right=r|0,i.left=n|0,i.v=i.top+i.bottom,i.h=i.left+i.right,i.top&&this.scrollTop<=0&&this.session&&this.session.setScrollTop(-i.top),this.updateFull()},this.setMargin=function(e,t,n,r){var i=this.margin;i.top=e|0,i.bottom=t|0,i.right=r|0,i.left=n|0,i.v=i.top+i.bottom,i.h=i.left+i.right,this.$updateCachedSize(!0,this.gutterWidth,this.$size.width,this.$size.height),this.updateFull()},this.getHScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible},this.setHScrollBarAlwaysVisible=function(e){this.setOption("hScrollBarAlwaysVisible",e)},this.getVScrollBarAlwaysVisible=function(){return this.$vScrollBarAlwaysVisible},this.setVScrollBarAlwaysVisible=function(e){this.setOption("vScrollBarAlwaysVisible",e)},this.$updateScrollBarV=function(){var e=this.layerConfig.maxHeight,t=this.$size.scrollerHeight;!this.$maxLines&&this.$scrollPastEnd&&(e-=(t-this.lineHeight)*this.$scrollPastEnd,this.scrollTop>e-t&&(e=this.scrollTop+t,this.scrollBarV.scrollTop=null)),this.scrollBarV.setScrollHeight(e+this.scrollMargin.v),this.scrollBarV.setScrollTop(this.scrollTop+this.scrollMargin.top)},this.$updateScrollBarH=function(){this.scrollBarH.setScrollWidth(this.layerConfig.width+2*this.$padding+this.scrollMargin.h),this.scrollBarH.setScrollLeft(this.scrollLeft+this.scrollMargin.left)},this.$frozen=!1,this.freeze=function(){this.$frozen=!0},this.unfreeze=function(){this.$frozen=!1},this.$renderChanges=function(e,t){this.$changes&&(e|=this.$changes,this.$changes=0);if(!this.session||!this.container.offsetWidth||this.$frozen||!e&&!t){this.$changes|=e;return}if(this.$size.$dirty)return this.$changes|=e,this.onResize(!0);this.lineHeight||this.$textLayer.checkForSizeChanges(),this._signal("beforeRender"),this.session&&this.session.$bidiHandler&&this.session.$bidiHandler.updateCharacterWidths(this.$fontMetrics);var n=this.layerConfig;if(e&this.CHANGE_FULL||e&this.CHANGE_SIZE||e&this.CHANGE_TEXT||e&this.CHANGE_LINES||e&this.CHANGE_SCROLL||e&this.CHANGE_H_SCROLL){e|=this.$computeLayerConfig()|this.$loop.clear();if(n.firstRow!=this.layerConfig.firstRow&&n.firstRowScreen==this.layerConfig.firstRowScreen){var r=this.scrollTop+(n.firstRow-this.layerConfig.firstRow)*this.lineHeight;r>0&&(this.scrollTop=r,e|=this.CHANGE_SCROLL,e|=this.$computeLayerConfig()|this.$loop.clear())}n=this.layerConfig,this.$updateScrollBarV(),e&this.CHANGE_H_SCROLL&&this.$updateScrollBarH(),i.translate(this.content,-this.scrollLeft,-n.offset);var s=n.width+2*this.$padding+"px",o=n.minHeight+"px";i.setStyle(this.content.style,"width",s),i.setStyle(this.content.style,"height",o)}e&this.CHANGE_H_SCROLL&&(i.translate(this.content,-this.scrollLeft,-n.offset),this.scroller.className=this.scrollLeft<=0?"ace_scroller":"ace_scroller ace_scroll-left");if(e&this.CHANGE_FULL){this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this._signal("afterRender");return}if(e&this.CHANGE_SCROLL){e&this.CHANGE_TEXT||e&this.CHANGE_LINES?this.$textLayer.update(n):this.$textLayer.scrollLines(n),this.$showGutter&&(e&this.CHANGE_GUTTER||e&this.CHANGE_LINES?this.$gutterLayer.update(n):this.$gutterLayer.scrollLines(n)),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this._signal("afterRender");return}e&this.CHANGE_TEXT?(this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n)):e&this.CHANGE_LINES?(this.$updateLines()||e&this.CHANGE_GUTTER&&this.$showGutter)&&this.$gutterLayer.update(n):e&this.CHANGE_TEXT||e&this.CHANGE_GUTTER?this.$showGutter&&this.$gutterLayer.update(n):e&this.CHANGE_CURSOR&&this.$highlightGutterLine&&this.$gutterLayer.updateLineHighlight(n),e&this.CHANGE_CURSOR&&(this.$cursorLayer.update(n),this.$moveTextAreaToCursor()),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)&&this.$markerFront.update(n),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)&&this.$markerBack.update(n),this._signal("afterRender")},this.$autosize=function(){var e=this.session.getScreenLength()*this.lineHeight,t=this.$maxLines*this.lineHeight,n=Math.min(t,Math.max((this.$minLines||1)*this.lineHeight,e))+this.scrollMargin.v+(this.$extraHeight||0);this.$horizScroll&&(n+=this.scrollBarH.getHeight()),this.$maxPixelHeight&&n>this.$maxPixelHeight&&(n=this.$maxPixelHeight);var r=n<=2*this.lineHeight,i=!r&&e>t;if(n!=this.desiredHeight||this.$size.height!=this.desiredHeight||i!=this.$vScroll){i!=this.$vScroll&&(this.$vScroll=i,this.scrollBarV.setVisible(i));var s=this.container.clientWidth;this.container.style.height=n+"px",this.$updateCachedSize(!0,this.$gutterWidth,s,n),this.desiredHeight=n,this._signal("autosize")}},this.$computeLayerConfig=function(){var e=this.session,t=this.$size,n=t.height<=2*this.lineHeight,r=this.session.getScreenLength(),i=r*this.lineHeight,s=this.$getLongestLine(),o=!n&&(this.$hScrollBarAlwaysVisible||t.scrollerWidth-s-2*this.$padding<0),u=this.$horizScroll!==o;u&&(this.$horizScroll=o,this.scrollBarH.setVisible(o));var a=this.$vScroll;this.$maxLines&&this.lineHeight>1&&this.$autosize();var f=t.scrollerHeight+this.lineHeight,l=!this.$maxLines&&this.$scrollPastEnd?(t.scrollerHeight-this.lineHeight)*this.$scrollPastEnd:0;i+=l;var c=this.scrollMargin;this.session.setScrollTop(Math.max(-c.top,Math.min(this.scrollTop,i-t.scrollerHeight+c.bottom))),this.session.setScrollLeft(Math.max(-c.left,Math.min(this.scrollLeft,s+2*this.$padding-t.scrollerWidth+c.right)));var h=!n&&(this.$vScrollBarAlwaysVisible||t.scrollerHeight-i+l<0||this.scrollTop>c.top),p=a!==h;p&&(this.$vScroll=h,this.scrollBarV.setVisible(h));var d=this.scrollTop%this.lineHeight,v=Math.ceil(f/this.lineHeight)-1,m=Math.max(0,Math.round((this.scrollTop-d)/this.lineHeight)),g=m+v,y,b,w=this.lineHeight;m=e.screenToDocumentRow(m,0);var E=e.getFoldLine(m);E&&(m=E.start.row),y=e.documentToScreenRow(m,0),b=e.getRowLength(m)*w,g=Math.min(e.screenToDocumentRow(g,0),e.getLength()-1),f=t.scrollerHeight+e.getRowLength(g)*w+b,d=this.scrollTop-y*w;var S=0;if(this.layerConfig.width!=s||u)S=this.CHANGE_H_SCROLL;if(u||p)S|=this.$updateCachedSize(!0,this.gutterWidth,t.width,t.height),this._signal("scrollbarVisibilityChanged"),p&&(s=this.$getLongestLine());return this.layerConfig={width:s,padding:this.$padding,firstRow:m,firstRowScreen:y,lastRow:g,lineHeight:w,characterWidth:this.characterWidth,minHeight:f,maxHeight:i,offset:d,gutterOffset:w?Math.max(0,Math.ceil((d+t.height-t.scrollerHeight)/w)):0,height:this.$size.scrollerHeight},this.session.$bidiHandler&&this.session.$bidiHandler.setContentWidth(s-this.$padding),S},this.$updateLines=function(){if(!this.$changedLines)return;var e=this.$changedLines.firstRow,t=this.$changedLines.lastRow;this.$changedLines=null;var n=this.layerConfig;if(e>n.lastRow+1)return;if(tthis.$textLayer.MAX_LINE_LENGTH&&(e=this.$textLayer.MAX_LINE_LENGTH+30),Math.max(this.$size.scrollerWidth-2*this.$padding,Math.round(e*this.characterWidth))},this.updateFrontMarkers=function(){this.$markerFront.setMarkers(this.session.getMarkers(!0)),this.$loop.schedule(this.CHANGE_MARKER_FRONT)},this.updateBackMarkers=function(){this.$markerBack.setMarkers(this.session.getMarkers()),this.$loop.schedule(this.CHANGE_MARKER_BACK)},this.addGutterDecoration=function(e,t){this.$gutterLayer.addGutterDecoration(e,t)},this.removeGutterDecoration=function(e,t){this.$gutterLayer.removeGutterDecoration(e,t)},this.updateBreakpoints=function(e){this.$loop.schedule(this.CHANGE_GUTTER)},this.setAnnotations=function(e){this.$gutterLayer.setAnnotations(e),this.$loop.schedule(this.CHANGE_GUTTER)},this.updateCursor=function(){this.$loop.schedule(this.CHANGE_CURSOR)},this.hideCursor=function(){this.$cursorLayer.hideCursor()},this.showCursor=function(){this.$cursorLayer.showCursor()},this.scrollSelectionIntoView=function(e,t,n){this.scrollCursorIntoView(e,n),this.scrollCursorIntoView(t,n)},this.scrollCursorIntoView=function(e,t,n){if(this.$size.scrollerHeight===0)return;var r=this.$cursorLayer.getPixelPosition(e),i=r.left,s=r.top,o=n&&n.top||0,u=n&&n.bottom||0,a=this.$scrollAnimation?this.session.getScrollTop():this.scrollTop;a+o>s?(t&&a+o>s+this.lineHeight&&(s-=t*this.$size.scrollerHeight),s===0&&(s=-this.scrollMargin.top),this.session.setScrollTop(s)):a+this.$size.scrollerHeight-ui?(i=1-this.scrollMargin.top)return!0;if(t>0&&this.session.getScrollTop()+this.$size.scrollerHeight-this.layerConfig.maxHeight<-1+this.scrollMargin.bottom)return!0;if(e<0&&this.session.getScrollLeft()>=1-this.scrollMargin.left)return!0;if(e>0&&this.session.getScrollLeft()+this.$size.scrollerWidth-this.layerConfig.width<-1+this.scrollMargin.right)return!0},this.pixelToScreenCoordinates=function(e,t){var n;if(this.$hasCssTransforms){n={top:0,left:0};var r=this.$fontMetrics.transformCoordinates([e,t]);e=r[1]-this.gutterWidth-this.margin.left,t=r[0]}else n=this.scroller.getBoundingClientRect();var i=e+this.scrollLeft-n.left-this.$padding,s=i/this.characterWidth,o=Math.floor((t+this.scrollTop-n.top)/this.lineHeight),u=this.$blockCursor?Math.floor(s):Math.round(s);return{row:o,column:u,side:s-u>0?1:-1,offsetX:i}},this.screenToTextCoordinates=function(e,t){var n;if(this.$hasCssTransforms){n={top:0,left:0};var r=this.$fontMetrics.transformCoordinates([e,t]);e=r[1]-this.gutterWidth-this.margin.left,t=r[0]}else n=this.scroller.getBoundingClientRect();var i=e+this.scrollLeft-n.left-this.$padding,s=i/this.characterWidth,o=this.$blockCursor?Math.floor(s):Math.round(s),u=Math.floor((t+this.scrollTop-n.top)/this.lineHeight);return this.session.screenToDocumentPosition(u,Math.max(o,0),i)},this.textToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=this.session.documentToScreenPosition(e,t),i=this.$padding+(this.session.$bidiHandler.isBidiRow(r.row,e)?this.session.$bidiHandler.getPosLeft(r.column):Math.round(r.column*this.characterWidth)),s=r.row*this.lineHeight;return{pageX:n.left+i-this.scrollLeft,pageY:n.top+s-this.scrollTop}},this.visualizeFocus=function(){i.addCssClass(this.container,"ace_focus")},this.visualizeBlur=function(){i.removeCssClass(this.container,"ace_focus")},this.showComposition=function(e){this.$composition=e,e.cssText||(e.cssText=this.textarea.style.cssText,e.keepTextAreaAtCursor=this.$keepTextAreaAtCursor),e.useTextareaForIME=this.$useTextareaForIME,this.$useTextareaForIME?(this.$keepTextAreaAtCursor=!0,i.addCssClass(this.textarea,"ace_composition"),this.textarea.style.cssText="",this.$moveTextAreaToCursor(),this.$cursorLayer.element.style.display="none"):e.markerId=this.session.addMarker(e.markerRange,"ace_composition_marker","text")},this.setCompositionText=function(e){var t=this.session.selection.cursor;this.addToken(e,"composition_placeholder",t.row,t.column),this.$moveTextAreaToCursor()},this.hideComposition=function(){if(!this.$composition)return;this.$composition.markerId&&this.session.removeMarker(this.$composition.markerId),i.removeCssClass(this.textarea,"ace_composition"),this.$keepTextAreaAtCursor=this.$composition.keepTextAreaAtCursor,this.textarea.style.cssText=this.$composition.cssText,this.$composition=null,this.$cursorLayer.element.style.display=""},this.addToken=function(e,t,n,r){var i=this.session;i.bgTokenizer.lines[n]=null;var s={type:t,value:e},o=i.getTokens(n);if(r==null)o.push(s);else{var u=0;for(var a=0;a50&&e.length>this.$doc.getLength()>>1?this.call("setValue",[this.$doc.getValue()]):this.emit("change",{data:e})}}).call(f.prototype);var l=function(e,t,n){var r=null,i=!1,u=Object.create(s),a=[],l=new f({messageBuffer:a,terminate:function(){},postMessage:function(e){a.push(e);if(!r)return;i?setTimeout(c):c()}});l.setEmitSync=function(e){i=e};var c=function(){var e=a.shift();e.command?r[e.command].apply(r,e.args):e.event&&u._signal(e.event,e.data)};return u.postMessage=function(e){l.onMessage({data:e})},u.callback=function(e,t){this.postMessage({type:"call",id:t,data:e})},u.emit=function(e,t){this.postMessage({type:"event",name:e,data:t})},o.loadModule(["worker",t],function(e){r=new e[n](u);while(a.length)c()}),l};t.UIWorkerClient=l,t.WorkerClient=f,t.createWorker=a}),ace.define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"],function(e,t,n){"use strict";var r=e("./range").Range,i=e("./lib/event_emitter").EventEmitter,s=e("./lib/oop"),o=function(e,t,n,r,i,s){var o=this;this.length=t,this.session=e,this.doc=e.getDocument(),this.mainClass=i,this.othersClass=s,this.$onUpdate=this.onUpdate.bind(this),this.doc.on("change",this.$onUpdate),this.$others=r,this.$onCursorChange=function(){setTimeout(function(){o.onCursorChange()})},this.$pos=n;var u=e.getUndoManager().$undoStack||e.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=u.length,this.setup(),e.selection.on("changeCursor",this.$onCursorChange)};(function(){s.implement(this,i),this.setup=function(){var e=this,t=this.doc,n=this.session;this.selectionBefore=n.selection.toJSON(),n.selection.inMultiSelectMode&&n.selection.toSingleRange(),this.pos=t.createAnchor(this.$pos.row,this.$pos.column);var i=this.pos;i.$insertRight=!0,i.detach(),i.markerId=n.addMarker(new r(i.row,i.column,i.row,i.column+this.length),this.mainClass,null,!1),this.others=[],this.$others.forEach(function(n){var r=t.createAnchor(n.row,n.column);r.$insertRight=!0,r.detach(),e.others.push(r)}),n.setUndoSelect(!1)},this.showOtherMarkers=function(){if(this.othersActive)return;var e=this.session,t=this;this.othersActive=!0,this.others.forEach(function(n){n.markerId=e.addMarker(new r(n.row,n.column,n.row,n.column+t.length),t.othersClass,null,!1)})},this.hideOtherMarkers=function(){if(!this.othersActive)return;this.othersActive=!1;for(var e=0;e=this.pos.column&&t.start.column<=this.pos.column+this.length+1,s=t.start.column-this.pos.column;this.updateAnchors(e),i&&(this.length+=n);if(i&&!this.session.$fromUndo)if(e.action==="insert")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.insertMergedLines(a,e.lines)}else if(e.action==="remove")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.remove(new r(a.row,a.column,a.row,a.column-n))}this.$updating=!1,this.updateMarkers()},this.updateAnchors=function(e){this.pos.onChange(e);for(var t=this.others.length;t--;)this.others[t].onChange(e);this.updateMarkers()},this.updateMarkers=function(){if(this.$updating)return;var e=this,t=this.session,n=function(n,i){t.removeMarker(n.markerId),n.markerId=t.addMarker(new r(n.row,n.column,n.row,n.column+e.length),i,null,!1)};n(this.pos,this.mainClass);for(var i=this.others.length;i--;)n(this.others[i],this.othersClass)},this.onCursorChange=function(e){if(this.$updating||!this.session)return;var t=this.session.selection.getCursor();t.row===this.pos.row&&t.column>=this.pos.column&&t.column<=this.pos.column+this.length?(this.showOtherMarkers(),this._emit("cursorEnter",e)):(this.hideOtherMarkers(),this._emit("cursorLeave",e))},this.detach=function(){this.session.removeMarker(this.pos&&this.pos.markerId),this.hideOtherMarkers(),this.doc.removeEventListener("change",this.$onUpdate),this.session.selection.removeEventListener("changeCursor",this.$onCursorChange),this.session.setUndoSelect(!0),this.session=null},this.cancel=function(){if(this.$undoStackDepth===-1)return;var e=this.session.getUndoManager(),t=(e.$undoStack||e.$undostack).length-this.$undoStackDepth;for(var n=0;n1&&!this.inMultiSelectMode&&(this._signal("multiSelect"),this.inMultiSelectMode=!0,this.session.$undoSelect=!1,this.rangeList.attach(this.session)),t||this.fromOrientedRange(e)},this.toSingleRange=function(e){e=e||this.ranges[0];var t=this.rangeList.removeAll();t.length&&this.$onRemoveRange(t),e&&this.fromOrientedRange(e)},this.substractPoint=function(e){var t=this.rangeList.substractPoint(e);if(t)return this.$onRemoveRange(t),t[0]},this.mergeOverlappingRanges=function(){var e=this.rangeList.merge();e.length&&this.$onRemoveRange(e)},this.$onAddRange=function(e){this.rangeCount=this.rangeList.ranges.length,this.ranges.unshift(e),this._signal("addRange",{range:e})},this.$onRemoveRange=function(e){this.rangeCount=this.rangeList.ranges.length;if(this.rangeCount==1&&this.inMultiSelectMode){var t=this.rangeList.ranges.pop();e.push(t),this.rangeCount=0}for(var n=e.length;n--;){var r=this.ranges.indexOf(e[n]);this.ranges.splice(r,1)}this._signal("removeRange",{ranges:e}),this.rangeCount===0&&this.inMultiSelectMode&&(this.inMultiSelectMode=!1,this._signal("singleSelect"),this.session.$undoSelect=!0,this.rangeList.detach(this.session)),t=t||this.ranges[0],t&&!t.isEqual(this.getRange())&&this.fromOrientedRange(t)},this.$initRangeList=function(){if(this.rangeList)return;this.rangeList=new r,this.ranges=[],this.rangeCount=0},this.getAllRanges=function(){return this.rangeCount?this.rangeList.ranges.concat():[this.getRange()]},this.splitIntoLines=function(){if(this.rangeCount>1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var n=this.getRange(),r=this.isBackwards(),s=n.start.row,o=n.end.row;if(s==o){if(r)var u=n.end,a=n.start;else var u=n.start,a=n.end;this.addRange(i.fromPoints(a,a)),this.addRange(i.fromPoints(u,u));return}var f=[],l=this.getLineRange(s,!0);l.start.column=n.start.column,f.push(l);for(var c=s+1;c1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var r=this.session.documentToScreenPosition(this.cursor),s=this.session.documentToScreenPosition(this.anchor),o=this.rectangularRangeBlock(r,s);o.forEach(this.addRange,this)}},this.rectangularRangeBlock=function(e,t,n){var r=[],s=e.column0)g--;if(g>0){var y=0;while(r[y].isEmpty())y++}for(var b=g;b>=y;b--)r[b].isEmpty()&&r.splice(b,1)}return r}}.call(s.prototype);var d=e("./editor").Editor;(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.addSelectionMarker=function(e){e.cursor||(e.cursor=e.end);var t=this.getSelectionStyle();return e.marker=this.session.addMarker(e,"ace_selection",t),this.session.$selectionMarkers.push(e),this.session.selectionMarkerCount=this.session.$selectionMarkers.length,e},this.removeSelectionMarker=function(e){if(!e.marker)return;this.session.removeMarker(e.marker);var t=this.session.$selectionMarkers.indexOf(e);t!=-1&&this.session.$selectionMarkers.splice(t,1),this.session.selectionMarkerCount=this.session.$selectionMarkers.length},this.removeSelectionMarkers=function(e){var t=this.session.$selectionMarkers;for(var n=e.length;n--;){var r=e[n];if(!r.marker)continue;this.session.removeMarker(r.marker);var i=t.indexOf(r);i!=-1&&t.splice(i,1)}this.session.selectionMarkerCount=t.length},this.$onAddRange=function(e){this.addSelectionMarker(e.range),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onRemoveRange=function(e){this.removeSelectionMarkers(e.ranges),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelect=function(e){if(this.inMultiSelectMode)return;this.inMultiSelectMode=!0,this.setStyle("ace_multiselect"),this.keyBinding.addKeyboardHandler(f.keyboardHandler),this.commands.setDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onSingleSelect=function(e){if(this.session.multiSelect.inVirtualMode)return;this.inMultiSelectMode=!1,this.unsetStyle("ace_multiselect"),this.keyBinding.removeKeyboardHandler(f.keyboardHandler),this.commands.removeDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers(),this._emit("changeSelection")},this.$onMultiSelectExec=function(e){var t=e.command,n=e.editor;if(!n.multiSelect)return;if(!t.multiSelectAction){var r=t.exec(n,e.args||{});n.multiSelect.addRange(n.multiSelect.toOrientedRange()),n.multiSelect.mergeOverlappingRanges()}else t.multiSelectAction=="forEach"?r=n.forEachSelection(t,e.args):t.multiSelectAction=="forEachLine"?r=n.forEachSelection(t,e.args,!0):t.multiSelectAction=="single"?(n.exitMultiSelectMode(),r=t.exec(n,e.args||{})):r=t.multiSelectAction(n,e.args||{});return r},this.forEachSelection=function(e,t,n){if(this.inVirtualSelectionMode)return;var r=n&&n.keepOrder,i=n==1||n&&n.$byLines,o=this.session,u=this.selection,a=u.rangeList,f=(r?u:a).ranges,l;if(!f.length)return e.exec?e.exec(this,t||{}):e(this,t||{});var c=u._eventRegistry;u._eventRegistry={};var h=new s(o);this.inVirtualSelectionMode=!0;for(var p=f.length;p--;){if(i)while(p>0&&f[p].start.row==f[p-1].end.row)p--;h.fromOrientedRange(f[p]),h.index=p,this.selection=o.selection=h;var d=e.exec?e.exec(this,t||{}):e(this,t||{});!l&&d!==undefined&&(l=d),h.toOrientedRange(f[p])}h.detach(),this.selection=o.selection=u,this.inVirtualSelectionMode=!1,u._eventRegistry=c,u.mergeOverlappingRanges(),u.ranges[0]&&u.fromOrientedRange(u.ranges[0]);var v=this.renderer.$scrollAnimation;return this.onCursorChange(),this.onSelectionChange(),v&&v.from==v.to&&this.renderer.animateScrolling(v.from),l},this.exitMultiSelectMode=function(){if(!this.inMultiSelectMode||this.inVirtualSelectionMode)return;this.multiSelect.toSingleRange()},this.getSelectedText=function(){var e="";if(this.inMultiSelectMode&&!this.inVirtualSelectionMode){var t=this.multiSelect.rangeList.ranges,n=[];for(var r=0;r0);u<0&&(u=0),f>=c&&(f=c-1)}var p=this.session.removeFullLines(u,f);p=this.$reAlignText(p,l),this.session.insert({row:u,column:0},p.join("\n")+"\n"),l||(o.start.column=0,o.end.column=p[p.length-1].length),this.selection.setRange(o)}else{s.forEach(function(e){t.substractPoint(e.cursor)});var d=0,v=Infinity,m=n.map(function(t){var n=t.cursor,r=e.getLine(n.row),i=r.substr(n.column).search(/\S/g);return i==-1&&(i=0),n.column>d&&(d=n.column),io?e.insert(r,a.stringRepeat(" ",s-o)):e.remove(new i(r.row,r.column,r.row,r.column-s+o)),t.start.column=t.end.column=d,t.start.row=t.end.row=r.row,t.cursor=t.end}),t.fromOrientedRange(n[0]),this.renderer.updateCursor(),this.renderer.updateBackMarkers()}},this.$reAlignText=function(e,t){function u(e){return a.stringRepeat(" ",e)}function f(e){return e[2]?u(i)+e[2]+u(s-e[2].length+o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function l(e){return e[2]?u(i+s-e[2].length)+e[2]+u(o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function c(e){return e[2]?u(i)+e[2]+u(o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}var n=!0,r=!0,i,s,o;return e.map(function(e){var t=e.match(/(\s*)(.*?)(\s*)([=:].*)/);return t?i==null?(i=t[1].length,s=t[2].length,o=t[3].length,t):(i+s+o!=t[1].length+t[2].length+t[3].length&&(r=!1),i!=t[1].length&&(n=!1),i>t[1].length&&(i=t[1].length),st[3].length&&(o=t[3].length),t):[e]}).map(t?f:n?r?l:f:c)}}).call(d.prototype),t.onSessionChange=function(e){var t=e.session;t&&!t.multiSelect&&(t.$selectionMarkers=[],t.selection.$initRangeList(),t.multiSelect=t.selection),this.multiSelect=t&&t.multiSelect;var n=e.oldSession;n&&(n.multiSelect.off("addRange",this.$onAddRange),n.multiSelect.off("removeRange",this.$onRemoveRange),n.multiSelect.off("multiSelect",this.$onMultiSelect),n.multiSelect.off("singleSelect",this.$onSingleSelect),n.multiSelect.lead.off("change",this.$checkMultiselectChange),n.multiSelect.anchor.off("change",this.$checkMultiselectChange)),t&&(t.multiSelect.on("addRange",this.$onAddRange),t.multiSelect.on("removeRange",this.$onRemoveRange),t.multiSelect.on("multiSelect",this.$onMultiSelect),t.multiSelect.on("singleSelect",this.$onSingleSelect),t.multiSelect.lead.on("change",this.$checkMultiselectChange),t.multiSelect.anchor.on("change",this.$checkMultiselectChange)),t&&this.inMultiSelectMode!=t.selection.inMultiSelectMode&&(t.selection.inMultiSelectMode?this.$onMultiSelect():this.$onSingleSelect())},t.MultiSelect=m,e("./config").defineOptions(d.prototype,"editor",{enableMultiselect:{set:function(e){m(this),e?(this.on("changeSession",this.$multiselectOnSessionChange),this.on("mousedown",o)):(this.off("changeSession",this.$multiselectOnSessionChange),this.off("mousedown",o))},value:!0},enableBlockSelect:{set:function(e){this.$blockSelectEnabled=e},value:!0}})}),ace.define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../../range").Range,i=t.FoldMode=function(){};(function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);return this.foldingStartMarker.test(r)?"start":t=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(r)?"end":""},this.getFoldWidgetRange=function(e,t,n){return null},this.indentationBlock=function(e,t,n){var i=/\S/,s=e.getLine(t),o=s.search(i);if(o==-1)return;var u=n||s.length,a=e.getLength(),f=t,l=t;while(++tf){var h=e.getLine(l).length;return new r(f,u,l,h)}},this.openingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i+1},u=e.$findClosingBracket(t,o,s);if(!u)return;var a=e.foldWidgets[u.row];return a==null&&(a=e.getFoldWidget(u.row)),a=="start"&&u.row>o.row&&(u.row--,u.column=e.getLine(u.row).length),r.fromPoints(o,u)},this.closingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i},u=e.$findOpeningBracket(t,o);if(!u)return;return u.column++,o.column--,r.fromPoints(u,o)}}).call(i.prototype)}),ace.define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";t.isDark=!1,t.cssClass="ace-tm",t.cssText='.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}',t.$id="ace/theme/textmate";var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)}),ace.define("ace/line_widgets",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/range"],function(e,t,n){"use strict";function o(e){this.session=e,this.session.widgetManager=this,this.session.getRowLength=this.getRowLength,this.session.$getWidgetScreenLength=this.$getWidgetScreenLength,this.updateOnChange=this.updateOnChange.bind(this),this.renderWidgets=this.renderWidgets.bind(this),this.measureWidgets=this.measureWidgets.bind(this),this.session._changedWidgets=[],this.$onChangeEditor=this.$onChangeEditor.bind(this),this.session.on("change",this.updateOnChange),this.session.on("changeFold",this.updateOnFold),this.session.on("changeEditor",this.$onChangeEditor)}var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./range").Range;(function(){this.getRowLength=function(e){var t;return this.lineWidgets?t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0:t=0,!this.$useWrapMode||!this.$wrapData[e]?1+t:this.$wrapData[e].length+1+t},this.$getWidgetScreenLength=function(){var e=0;return this.lineWidgets.forEach(function(t){t&&t.rowCount&&!t.hidden&&(e+=t.rowCount)}),e},this.$onChangeEditor=function(e){this.attach(e.editor)},this.attach=function(e){e&&e.widgetManager&&e.widgetManager!=this&&e.widgetManager.detach();if(this.editor==e)return;this.detach(),this.editor=e,e&&(e.widgetManager=this,e.renderer.on("beforeRender",this.measureWidgets),e.renderer.on("afterRender",this.renderWidgets))},this.detach=function(e){var t=this.editor;if(!t)return;this.editor=null,t.widgetManager=null,t.renderer.off("beforeRender",this.measureWidgets),t.renderer.off("afterRender",this.renderWidgets);var n=this.session.lineWidgets;n&&n.forEach(function(e){e&&e.el&&e.el.parentNode&&(e._inDocument=!1,e.el.parentNode.removeChild(e.el))})},this.updateOnFold=function(e,t){var n=t.lineWidgets;if(!n||!e.action)return;var r=e.data,i=r.start.row,s=r.end.row,o=e.action=="add";for(var u=i+1;u0&&!r[i])i--;this.firstRow=n.firstRow,this.lastRow=n.lastRow,t.$cursorLayer.config=n;for(var o=i;o<=s;o++){var u=r[o];if(!u||!u.el)continue;if(u.hidden){u.el.style.top=-100-(u.pixelHeight||0)+"px";continue}u._inDocument||(u._inDocument=!0,t.container.appendChild(u.el));var a=t.$cursorLayer.getPixelPosition({row:o,column:0},!0).top;u.coverLine||(a+=n.lineHeight*this.session.getRowLineCount(u.row)),u.el.style.top=a-n.offset+"px";var f=u.coverGutter?0:t.gutterWidth;u.fixedWidth||(f-=t.scrollLeft),u.el.style.left=f+"px",u.fullWidth&&u.screenWidth&&(u.el.style.minWidth=n.width+2*n.padding+"px"),u.fixedWidth?u.el.style.right=t.scrollBar.getWidth()+"px":u.el.style.right=""}}}).call(o.prototype),t.LineWidgets=o}),ace.define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"],function(e,t,n){"use strict";function o(e,t,n){var r=0,i=e.length-1;while(r<=i){var s=r+i>>1,o=n(t,e[s]);if(o>0)r=s+1;else{if(!(o<0))return s;i=s-1}}return-(r+1)}function u(e,t,n){var r=e.getAnnotations().sort(s.comparePoints);if(!r.length)return;var i=o(r,{row:t,column:-1},s.comparePoints);i<0&&(i=-i-1),i>=r.length?i=n>0?0:r.length-1:i===0&&n<0&&(i=r.length-1);var u=r[i];if(!u||!n)return;if(u.row===t){do u=r[i+=n];while(u&&u.row===t);if(!u)return r.slice()}var a=[];t=u.row;do a[n<0?"unshift":"push"](u),u=r[i+=n];while(u&&u.row==t);return a.length&&a}var r=e("../line_widgets").LineWidgets,i=e("../lib/dom"),s=e("../range").Range;t.showErrorMarker=function(e,t){var n=e.session;n.widgetManager||(n.widgetManager=new r(n),n.widgetManager.attach(e));var s=e.getCursorPosition(),o=s.row,a=n.widgetManager.getWidgetsAtRow(o).filter(function(e){return e.type=="errorMarker"})[0];a?a.destroy():o-=t;var f=u(n,o,t),l;if(f){var c=f[0];s.column=(c.pos&&typeof c.column!="number"?c.pos.sc:c.column)||0,s.row=c.row,l=e.renderer.$gutterLayer.$annotations[s.row]}else{if(a)return;l={text:["Looks good!"],className:"ace_ok"}}e.session.unfold(s.row),e.selection.moveToPosition(s);var h={row:s.row,fixedWidth:!0,coverGutter:!0,el:i.createElement("div"),type:"errorMarker"},p=h.el.appendChild(i.createElement("div")),d=h.el.appendChild(i.createElement("div"));d.className="error_widget_arrow "+l.className;var v=e.renderer.$cursorLayer.getPixelPosition(s).left;d.style.left=v+e.renderer.gutterWidth-5+"px",h.el.className="error_widget_wrapper",p.className="error_widget "+l.className,p.innerHTML=l.text.join("
"),p.appendChild(i.createElement("div"));var m=function(e,t,n){if(t===0&&(n==="esc"||n==="return"))return h.destroy(),{command:"null"}};h.destroy=function(){if(e.$mouseHandler.isMousePressed)return;e.keyBinding.removeKeyboardHandler(m),n.widgetManager.removeLineWidget(h),e.off("changeSelection",h.destroy),e.off("changeSession",h.destroy),e.off("mouseup",h.destroy),e.off("change",h.destroy)},e.keyBinding.addKeyboardHandler(m),e.on("changeSelection",h.destroy),e.on("changeSession",h.destroy),e.on("mouseup",h.destroy),e.on("change",h.destroy),e.session.widgetManager.addLineWidget(h),h.el.onmousedown=e.focus.bind(e),e.renderer.scrollCursorIntoView(null,.5,{bottom:h.el.offsetHeight})},i.importCssString(" .error_widget_wrapper { background: inherit; color: inherit; border:none } .error_widget { border-top: solid 2px; border-bottom: solid 2px; margin: 5px 0; padding: 10px 40px; white-space: pre-wrap; } .error_widget.ace_error, .error_widget_arrow.ace_error{ border-color: #ff5a5a } .error_widget.ace_warning, .error_widget_arrow.ace_warning{ border-color: #F1D817 } .error_widget.ace_info, .error_widget_arrow.ace_info{ border-color: #5a5a5a } .error_widget.ace_ok, .error_widget_arrow.ace_ok{ border-color: #5aaa5a } .error_widget_arrow { position: absolute; border: solid 5px; border-top-color: transparent!important; border-right-color: transparent!important; border-left-color: transparent!important; top: -5px; }","")}),ace.define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/range","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config"],function(e,t,n){"use strict";e("./lib/fixoldbrowsers");var r=e("./lib/dom"),i=e("./lib/event"),s=e("./range").Range,o=e("./editor").Editor,u=e("./edit_session").EditSession,a=e("./undomanager").UndoManager,f=e("./virtual_renderer").VirtualRenderer;e("./worker/worker_client"),e("./keyboard/hash_handler"),e("./placeholder"),e("./multi_select"),e("./mode/folding/fold_mode"),e("./theme/textmate"),e("./ext/error_marker"),t.config=e("./config"),t.require=e,typeof define=="function"&&(t.define=define),t.edit=function(e,n){if(typeof e=="string"){var s=e;e=document.getElementById(s);if(!e)throw new Error("ace.edit can't find div #"+s)}if(e&&e.env&&e.env.editor instanceof o)return e.env.editor;var u="";if(e&&/input|textarea/i.test(e.tagName)){var a=e;u=a.value,e=r.createElement("pre"),a.parentNode.replaceChild(e,a)}else e&&(u=e.textContent,e.innerHTML="");var l=t.createEditSession(u),c=new o(new f(e),l,n),h={document:l,editor:c,onResize:c.resize.bind(c,null)};return a&&(h.textarea=a),i.addListener(window,"resize",h.onResize),c.on("destroy",function(){i.removeListener(window,"resize",h.onResize),h.editor.container.env=null}),c.container.env=c.env=h,c},t.createEditSession=function(e,t){var n=new u(e,t);return n.setUndoManager(new a),n},t.Range=s,t.Editor=o,t.EditSession=u,t.UndoManager=a,t.VirtualRenderer=f,t.version="1.4.4"}); (function() { + ace.require(["ace/ace"], function(a) { + if (a) { + a.config.init(true); + a.define = ace.define; + } + if (!window.ace) + window.ace = a; + for (var key in a) if (a.hasOwnProperty(key)) + window.ace[key] = a[key]; + window.ace["default"] = window.ace; + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = window.ace; + } + }); + })(); diff --git a/ayu-highlight.css b/ayu-highlight.css new file mode 100644 index 0000000..32c9432 --- /dev/null +++ b/ayu-highlight.css @@ -0,0 +1,78 @@ +/* +Based off of the Ayu theme +Original by Dempfi (https://github.com/dempfi/ayu) +*/ + +.hljs { + display: block; + overflow-x: auto; + background: #191f26; + color: #e6e1cf; +} + +.hljs-comment, +.hljs-quote { + color: #5c6773; + font-style: italic; +} + +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-attr, +.hljs-regexp, +.hljs-link, +.hljs-selector-id, +.hljs-selector-class { + color: #ff7733; +} + +.hljs-number, +.hljs-meta, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #ffee99; +} + +.hljs-string, +.hljs-bullet { + color: #b8cc52; +} + +.hljs-title, +.hljs-built_in, +.hljs-section { + color: #ffb454; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-symbol { + color: #ff7733; +} + +.hljs-name { + color: #36a3d9; +} + +.hljs-tag { + color: #00568d; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-addition { + color: #91b362; +} + +.hljs-deletion { + color: #d96c75; +} diff --git a/book.js b/book.js new file mode 100644 index 0000000..178f1e9 --- /dev/null +++ b/book.js @@ -0,0 +1,690 @@ +"use strict"; + +// Fix back button cache problem +window.onunload = function () { }; + +// Global variable, shared between modules +function playground_text(playground, hidden = true) { + let code_block = playground.querySelector("code"); + + if (window.ace && code_block.classList.contains("editable")) { + let editor = window.ace.edit(code_block); + return editor.getValue(); + } else if (hidden) { + return code_block.textContent; + } else { + return code_block.innerText; + } +} + +(function codeSnippets() { + function fetch_with_timeout(url, options, timeout = 6000) { + return Promise.race([ + fetch(url, options), + new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), timeout)) + ]); + } + + var playgrounds = Array.from(document.querySelectorAll(".playground")); + if (playgrounds.length > 0) { + fetch_with_timeout("https://play.rust-lang.org/meta/crates", { + headers: { + 'Content-Type': "application/json", + }, + method: 'POST', + mode: 'cors', + }) + .then(response => response.json()) + .then(response => { + // get list of crates available in the rust playground + let playground_crates = response.crates.map(item => item["id"]); + playgrounds.forEach(block => handle_crate_list_update(block, playground_crates)); + }); + } + + function handle_crate_list_update(playground_block, playground_crates) { + // update the play buttons after receiving the response + update_play_button(playground_block, playground_crates); + + // and install on change listener to dynamically update ACE editors + if (window.ace) { + let code_block = playground_block.querySelector("code"); + if (code_block.classList.contains("editable")) { + let editor = window.ace.edit(code_block); + editor.addEventListener("change", function (e) { + update_play_button(playground_block, playground_crates); + }); + // add Ctrl-Enter command to execute rust code + editor.commands.addCommand({ + name: "run", + bindKey: { + win: "Ctrl-Enter", + mac: "Ctrl-Enter" + }, + exec: _editor => run_rust_code(playground_block) + }); + } + } + } + + // updates the visibility of play button based on `no_run` class and + // used crates vs ones available on https://play.rust-lang.org + function update_play_button(pre_block, playground_crates) { + var play_button = pre_block.querySelector(".play-button"); + + // skip if code is `no_run` + if (pre_block.querySelector('code').classList.contains("no_run")) { + play_button.classList.add("hidden"); + return; + } + + // get list of `extern crate`'s from snippet + var txt = playground_text(pre_block); + var re = /extern\s+crate\s+([a-zA-Z_0-9]+)\s*;/g; + var snippet_crates = []; + var item; + while (item = re.exec(txt)) { + snippet_crates.push(item[1]); + } + + // check if all used crates are available on play.rust-lang.org + var all_available = snippet_crates.every(function (elem) { + return playground_crates.indexOf(elem) > -1; + }); + + if (all_available) { + play_button.classList.remove("hidden"); + } else { + play_button.classList.add("hidden"); + } + } + + function run_rust_code(code_block) { + var result_block = code_block.querySelector(".result"); + if (!result_block) { + result_block = document.createElement('code'); + result_block.className = 'result hljs language-bash'; + + code_block.append(result_block); + } + + let text = playground_text(code_block); + let classes = code_block.querySelector('code').classList; + let edition = "2015"; + if(classes.contains("edition2018")) { + edition = "2018"; + } else if(classes.contains("edition2021")) { + edition = "2021"; + } + var params = { + version: "stable", + optimize: "0", + code: text, + edition: edition + }; + + if (text.indexOf("#![feature") !== -1) { + params.version = "nightly"; + } + + result_block.innerText = "Running..."; + + fetch_with_timeout("https://play.rust-lang.org/evaluate.json", { + headers: { + 'Content-Type': "application/json", + }, + method: 'POST', + mode: 'cors', + body: JSON.stringify(params) + }) + .then(response => response.json()) + .then(response => { + if (response.result.trim() === '') { + result_block.innerText = "No output"; + result_block.classList.add("result-no-output"); + } else { + result_block.innerText = response.result; + result_block.classList.remove("result-no-output"); + } + }) + .catch(error => result_block.innerText = "Playground Communication: " + error.message); + } + + // Syntax highlighting Configuration + hljs.configure({ + tabReplace: ' ', // 4 spaces + languages: [], // Languages used for auto-detection + }); + + let code_nodes = Array + .from(document.querySelectorAll('code')) + // Don't highlight `inline code` blocks in headers. + .filter(function (node) {return !node.parentElement.classList.contains("header"); }); + + if (window.ace) { + // language-rust class needs to be removed for editable + // blocks or highlightjs will capture events + code_nodes + .filter(function (node) {return node.classList.contains("editable"); }) + .forEach(function (block) { block.classList.remove('language-rust'); }); + + code_nodes + .filter(function (node) {return !node.classList.contains("editable"); }) + .forEach(function (block) { hljs.highlightBlock(block); }); + } else { + code_nodes.forEach(function (block) { hljs.highlightBlock(block); }); + } + + // Adding the hljs class gives code blocks the color css + // even if highlighting doesn't apply + code_nodes.forEach(function (block) { block.classList.add('hljs'); }); + + Array.from(document.querySelectorAll("code.hljs")).forEach(function (block) { + + var lines = Array.from(block.querySelectorAll('.boring')); + // If no lines were hidden, return + if (!lines.length) { return; } + block.classList.add("hide-boring"); + + var buttons = document.createElement('div'); + buttons.className = 'buttons'; + buttons.innerHTML = ""; + + // add expand button + var pre_block = block.parentNode; + pre_block.insertBefore(buttons, pre_block.firstChild); + + pre_block.querySelector('.buttons').addEventListener('click', function (e) { + if (e.target.classList.contains('fa-eye')) { + e.target.classList.remove('fa-eye'); + e.target.classList.add('fa-eye-slash'); + e.target.title = 'Hide lines'; + e.target.setAttribute('aria-label', e.target.title); + + block.classList.remove('hide-boring'); + } else if (e.target.classList.contains('fa-eye-slash')) { + e.target.classList.remove('fa-eye-slash'); + e.target.classList.add('fa-eye'); + e.target.title = 'Show hidden lines'; + e.target.setAttribute('aria-label', e.target.title); + + block.classList.add('hide-boring'); + } + }); + }); + + if (window.playground_copyable) { + Array.from(document.querySelectorAll('pre code')).forEach(function (block) { + var pre_block = block.parentNode; + if (!pre_block.classList.contains('playground')) { + var buttons = pre_block.querySelector(".buttons"); + if (!buttons) { + buttons = document.createElement('div'); + buttons.className = 'buttons'; + pre_block.insertBefore(buttons, pre_block.firstChild); + } + + var clipButton = document.createElement('button'); + clipButton.className = 'clip-button'; + clipButton.title = 'Copy to clipboard'; + clipButton.setAttribute('aria-label', clipButton.title); + clipButton.innerHTML = ''; + + buttons.insertBefore(clipButton, buttons.firstChild); + } + }); + } + + // Process playground code blocks + Array.from(document.querySelectorAll(".playground")).forEach(function (pre_block) { + // Add play button + var buttons = pre_block.querySelector(".buttons"); + if (!buttons) { + buttons = document.createElement('div'); + buttons.className = 'buttons'; + pre_block.insertBefore(buttons, pre_block.firstChild); + } + + var runCodeButton = document.createElement('button'); + runCodeButton.className = 'fa fa-play play-button'; + runCodeButton.hidden = true; + runCodeButton.title = 'Run this code'; + runCodeButton.setAttribute('aria-label', runCodeButton.title); + + buttons.insertBefore(runCodeButton, buttons.firstChild); + runCodeButton.addEventListener('click', function (e) { + run_rust_code(pre_block); + }); + + if (window.playground_copyable) { + var copyCodeClipboardButton = document.createElement('button'); + copyCodeClipboardButton.className = 'clip-button'; + copyCodeClipboardButton.innerHTML = ''; + copyCodeClipboardButton.title = 'Copy to clipboard'; + copyCodeClipboardButton.setAttribute('aria-label', copyCodeClipboardButton.title); + + buttons.insertBefore(copyCodeClipboardButton, buttons.firstChild); + } + + let code_block = pre_block.querySelector("code"); + if (window.ace && code_block.classList.contains("editable")) { + var undoChangesButton = document.createElement('button'); + undoChangesButton.className = 'fa fa-history reset-button'; + undoChangesButton.title = 'Undo changes'; + undoChangesButton.setAttribute('aria-label', undoChangesButton.title); + + buttons.insertBefore(undoChangesButton, buttons.firstChild); + + undoChangesButton.addEventListener('click', function () { + let editor = window.ace.edit(code_block); + editor.setValue(editor.originalCode); + editor.clearSelection(); + }); + } + }); +})(); + +(function themes() { + var html = document.querySelector('html'); + var themeToggleButton = document.getElementById('theme-toggle'); + var themePopup = document.getElementById('theme-list'); + var themeColorMetaTag = document.querySelector('meta[name="theme-color"]'); + var themeIds = []; + themePopup.querySelectorAll('button.theme').forEach(function (el) { + themeIds.push(el.id); + }); + var stylesheets = { + ayuHighlight: document.querySelector("[href$='ayu-highlight.css']"), + tomorrowNight: document.querySelector("[href$='tomorrow-night.css']"), + highlight: document.querySelector("[href$='highlight.css']"), + }; + + function showThemes() { + themePopup.style.display = 'block'; + themeToggleButton.setAttribute('aria-expanded', true); + themePopup.querySelector("button#" + get_theme()).focus(); + } + + function updateThemeSelected() { + themePopup.querySelectorAll('.theme-selected').forEach(function (el) { + el.classList.remove('theme-selected'); + }); + themePopup.querySelector("button#" + get_theme()).classList.add('theme-selected'); + } + + function hideThemes() { + themePopup.style.display = 'none'; + themeToggleButton.setAttribute('aria-expanded', false); + themeToggleButton.focus(); + } + + function get_theme() { + var theme; + try { theme = localStorage.getItem('mdbook-theme'); } catch (e) { } + if (theme === null || theme === undefined || !themeIds.includes(theme)) { + return default_theme; + } else { + return theme; + } + } + + function set_theme(theme, store = true) { + let ace_theme; + + if (theme == 'coal' || theme == 'navy') { + stylesheets.ayuHighlight.disabled = true; + stylesheets.tomorrowNight.disabled = false; + stylesheets.highlight.disabled = true; + + ace_theme = "ace/theme/tomorrow_night"; + } else if (theme == 'ayu') { + stylesheets.ayuHighlight.disabled = false; + stylesheets.tomorrowNight.disabled = true; + stylesheets.highlight.disabled = true; + ace_theme = "ace/theme/tomorrow_night"; + } else { + stylesheets.ayuHighlight.disabled = true; + stylesheets.tomorrowNight.disabled = true; + stylesheets.highlight.disabled = false; + ace_theme = "ace/theme/dawn"; + } + + setTimeout(function () { + themeColorMetaTag.content = getComputedStyle(document.documentElement).backgroundColor; + }, 1); + + if (window.ace && window.editors) { + window.editors.forEach(function (editor) { + editor.setTheme(ace_theme); + }); + } + + var previousTheme = get_theme(); + + if (store) { + try { localStorage.setItem('mdbook-theme', theme); } catch (e) { } + } + + html.classList.remove(previousTheme); + html.classList.add(theme); + updateThemeSelected(); + } + + // Set theme + var theme = get_theme(); + + set_theme(theme, false); + + themeToggleButton.addEventListener('click', function () { + if (themePopup.style.display === 'block') { + hideThemes(); + } else { + showThemes(); + } + }); + + themePopup.addEventListener('click', function (e) { + var theme; + if (e.target.className === "theme") { + theme = e.target.id; + } else if (e.target.parentElement.className === "theme") { + theme = e.target.parentElement.id; + } else { + return; + } + set_theme(theme); + }); + + themePopup.addEventListener('focusout', function(e) { + // e.relatedTarget is null in Safari and Firefox on macOS (see workaround below) + if (!!e.relatedTarget && !themeToggleButton.contains(e.relatedTarget) && !themePopup.contains(e.relatedTarget)) { + hideThemes(); + } + }); + + // Should not be needed, but it works around an issue on macOS & iOS: https://github.com/rust-lang/mdBook/issues/628 + document.addEventListener('click', function(e) { + if (themePopup.style.display === 'block' && !themeToggleButton.contains(e.target) && !themePopup.contains(e.target)) { + hideThemes(); + } + }); + + document.addEventListener('keydown', function (e) { + if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; } + if (!themePopup.contains(e.target)) { return; } + + switch (e.key) { + case 'Escape': + e.preventDefault(); + hideThemes(); + break; + case 'ArrowUp': + e.preventDefault(); + var li = document.activeElement.parentElement; + if (li && li.previousElementSibling) { + li.previousElementSibling.querySelector('button').focus(); + } + break; + case 'ArrowDown': + e.preventDefault(); + var li = document.activeElement.parentElement; + if (li && li.nextElementSibling) { + li.nextElementSibling.querySelector('button').focus(); + } + break; + case 'Home': + e.preventDefault(); + themePopup.querySelector('li:first-child button').focus(); + break; + case 'End': + e.preventDefault(); + themePopup.querySelector('li:last-child button').focus(); + break; + } + }); +})(); + +(function sidebar() { + var body = document.querySelector("body"); + var sidebar = document.getElementById("sidebar"); + var sidebarLinks = document.querySelectorAll('#sidebar a'); + var sidebarToggleButton = document.getElementById("sidebar-toggle"); + var sidebarResizeHandle = document.getElementById("sidebar-resize-handle"); + var firstContact = null; + + function showSidebar() { + body.classList.remove('sidebar-hidden') + body.classList.add('sidebar-visible'); + Array.from(sidebarLinks).forEach(function (link) { + link.setAttribute('tabIndex', 0); + }); + sidebarToggleButton.setAttribute('aria-expanded', true); + sidebar.setAttribute('aria-hidden', false); + try { localStorage.setItem('mdbook-sidebar', 'visible'); } catch (e) { } + } + + function hideSidebar() { + body.classList.remove('sidebar-visible') + body.classList.add('sidebar-hidden'); + Array.from(sidebarLinks).forEach(function (link) { + link.setAttribute('tabIndex', -1); + }); + sidebarToggleButton.setAttribute('aria-expanded', false); + sidebar.setAttribute('aria-hidden', true); + try { localStorage.setItem('mdbook-sidebar', 'hidden'); } catch (e) { } + } + + // Toggle sidebar + sidebarToggleButton.addEventListener('click', function sidebarToggle() { + if (body.classList.contains("sidebar-hidden")) { + var current_width = parseInt( + document.documentElement.style.getPropertyValue('--sidebar-width'), 10); + if (current_width < 150) { + document.documentElement.style.setProperty('--sidebar-width', '150px'); + } + showSidebar(); + } else if (body.classList.contains("sidebar-visible")) { + hideSidebar(); + } else { + if (getComputedStyle(sidebar)['transform'] === 'none') { + hideSidebar(); + } else { + showSidebar(); + } + } + }); + + sidebarResizeHandle.addEventListener('mousedown', initResize, false); + + function initResize(e) { + window.addEventListener('mousemove', resize, false); + window.addEventListener('mouseup', stopResize, false); + body.classList.add('sidebar-resizing'); + } + function resize(e) { + var pos = (e.clientX - sidebar.offsetLeft); + if (pos < 20) { + hideSidebar(); + } else { + if (body.classList.contains("sidebar-hidden")) { + showSidebar(); + } + pos = Math.min(pos, window.innerWidth - 100); + document.documentElement.style.setProperty('--sidebar-width', pos + 'px'); + } + } + //on mouseup remove windows functions mousemove & mouseup + function stopResize(e) { + body.classList.remove('sidebar-resizing'); + window.removeEventListener('mousemove', resize, false); + window.removeEventListener('mouseup', stopResize, false); + } + + document.addEventListener('touchstart', function (e) { + firstContact = { + x: e.touches[0].clientX, + time: Date.now() + }; + }, { passive: true }); + + document.addEventListener('touchmove', function (e) { + if (!firstContact) + return; + + var curX = e.touches[0].clientX; + var xDiff = curX - firstContact.x, + tDiff = Date.now() - firstContact.time; + + if (tDiff < 250 && Math.abs(xDiff) >= 150) { + if (xDiff >= 0 && firstContact.x < Math.min(document.body.clientWidth * 0.25, 300)) + showSidebar(); + else if (xDiff < 0 && curX < 300) + hideSidebar(); + + firstContact = null; + } + }, { passive: true }); +})(); + +(function chapterNavigation() { + document.addEventListener('keydown', function (e) { + if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; } + if (window.search && window.search.hasFocus()) { return; } + var html = document.querySelector('html'); + + function next() { + var nextButton = document.querySelector('.nav-chapters.next'); + if (nextButton) { + window.location.href = nextButton.href; + } + } + function prev() { + var previousButton = document.querySelector('.nav-chapters.previous'); + if (previousButton) { + window.location.href = previousButton.href; + } + } + switch (e.key) { + case 'ArrowRight': + e.preventDefault(); + if (html.dir == 'rtl') { + prev(); + } else { + next(); + } + break; + case 'ArrowLeft': + e.preventDefault(); + if (html.dir == 'rtl') { + next(); + } else { + prev(); + } + break; + } + }); +})(); + +(function clipboard() { + var clipButtons = document.querySelectorAll('.clip-button'); + + function hideTooltip(elem) { + elem.firstChild.innerText = ""; + elem.className = 'clip-button'; + } + + function showTooltip(elem, msg) { + elem.firstChild.innerText = msg; + elem.className = 'clip-button tooltipped'; + } + + var clipboardSnippets = new ClipboardJS('.clip-button', { + text: function (trigger) { + hideTooltip(trigger); + let playground = trigger.closest("pre"); + return playground_text(playground, false); + } + }); + + Array.from(clipButtons).forEach(function (clipButton) { + clipButton.addEventListener('mouseout', function (e) { + hideTooltip(e.currentTarget); + }); + }); + + clipboardSnippets.on('success', function (e) { + e.clearSelection(); + showTooltip(e.trigger, "Copied!"); + }); + + clipboardSnippets.on('error', function (e) { + showTooltip(e.trigger, "Clipboard error!"); + }); +})(); + +(function scrollToTop () { + var menuTitle = document.querySelector('.menu-title'); + + menuTitle.addEventListener('click', function () { + document.scrollingElement.scrollTo({ top: 0, behavior: 'smooth' }); + }); +})(); + +(function controllMenu() { + var menu = document.getElementById('menu-bar'); + + (function controllPosition() { + var scrollTop = document.scrollingElement.scrollTop; + var prevScrollTop = scrollTop; + var minMenuY = -menu.clientHeight - 50; + // When the script loads, the page can be at any scroll (e.g. if you reforesh it). + menu.style.top = scrollTop + 'px'; + // Same as parseInt(menu.style.top.slice(0, -2), but faster + var topCache = menu.style.top.slice(0, -2); + menu.classList.remove('sticky'); + var stickyCache = false; // Same as menu.classList.contains('sticky'), but faster + document.addEventListener('scroll', function () { + scrollTop = Math.max(document.scrollingElement.scrollTop, 0); + // `null` means that it doesn't need to be updated + var nextSticky = null; + var nextTop = null; + var scrollDown = scrollTop > prevScrollTop; + var menuPosAbsoluteY = topCache - scrollTop; + if (scrollDown) { + nextSticky = false; + if (menuPosAbsoluteY > 0) { + nextTop = prevScrollTop; + } + } else { + if (menuPosAbsoluteY > 0) { + nextSticky = true; + } else if (menuPosAbsoluteY < minMenuY) { + nextTop = prevScrollTop + minMenuY; + } + } + if (nextSticky === true && stickyCache === false) { + menu.classList.add('sticky'); + stickyCache = true; + } else if (nextSticky === false && stickyCache === true) { + menu.classList.remove('sticky'); + stickyCache = false; + } + if (nextTop !== null) { + menu.style.top = nextTop + 'px'; + topCache = nextTop; + } + prevScrollTop = scrollTop; + }, { passive: true }); + })(); + (function controllBorder() { + function updateBorder() { + if (menu.offsetTop === 0) { + menu.classList.remove('bordered'); + } else { + menu.classList.add('bordered'); + } + } + updateBorder(); + document.addEventListener('scroll', updateBorder, { passive: true }); + })(); +})(); diff --git a/clipboard.min.js b/clipboard.min.js new file mode 100644 index 0000000..02c549e --- /dev/null +++ b/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.4 + * https://zenorocha.github.io/clipboard.js + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return function(n){var o={};function r(t){if(o[t])return o[t].exports;var e=o[t]={i:t,l:!1,exports:{}};return n[t].call(e.exports,e,e.exports,r),e.l=!0,e.exports}return r.m=n,r.c=o,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=0)}([function(t,e,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i=function(){function o(t,e){for(var n=0;n .hljs { + color: var(--links); +} + +/* Menu Bar */ + +#menu-bar, +#menu-bar-hover-placeholder { + z-index: 101; + margin: auto calc(0px - var(--page-padding)); +} +#menu-bar { + position: relative; + display: flex; + flex-wrap: wrap; + background-color: var(--bg); + border-bottom-color: var(--bg); + border-bottom-width: 1px; + border-bottom-style: solid; +} +#menu-bar.sticky, +.js #menu-bar-hover-placeholder:hover + #menu-bar, +.js #menu-bar:hover, +.js.sidebar-visible #menu-bar { + position: -webkit-sticky; + position: sticky; + top: 0 !important; +} +#menu-bar-hover-placeholder { + position: sticky; + position: -webkit-sticky; + top: 0; + height: var(--menu-bar-height); +} +#menu-bar.bordered { + border-bottom-color: var(--table-border-color); +} +#menu-bar i, #menu-bar .icon-button { + position: relative; + padding: 0 8px; + z-index: 10; + line-height: var(--menu-bar-height); + cursor: pointer; + transition: color 0.5s; +} +@media only screen and (max-width: 420px) { + #menu-bar i, #menu-bar .icon-button { + padding: 0 5px; + } +} + +.icon-button { + border: none; + background: none; + padding: 0; + color: inherit; +} +.icon-button i { + margin: 0; +} + +.right-buttons { + margin: 0 15px; +} +.right-buttons a { + text-decoration: none; +} + +.left-buttons { + display: flex; + margin: 0 5px; +} +.no-js .left-buttons { + display: none; +} + +.menu-title { + display: inline-block; + font-weight: 200; + font-size: 2.4rem; + line-height: var(--menu-bar-height); + text-align: center; + margin: 0; + flex: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.js .menu-title { + cursor: pointer; +} + +.menu-bar, +.menu-bar:visited, +.nav-chapters, +.nav-chapters:visited, +.mobile-nav-chapters, +.mobile-nav-chapters:visited, +.menu-bar .icon-button, +.menu-bar a i { + color: var(--icons); +} + +.menu-bar i:hover, +.menu-bar .icon-button:hover, +.nav-chapters:hover, +.mobile-nav-chapters i:hover { + color: var(--icons-hover); +} + +/* Nav Icons */ + +.nav-chapters { + font-size: 2.5em; + text-align: center; + text-decoration: none; + + position: fixed; + top: 0; + bottom: 0; + margin: 0; + max-width: 3%; + min-width: 3%; + + display: flex; + justify-content: center; + align-content: center; + flex-direction: column; + + transition: color 0.5s, background-color 0.5s; +} + +.nav-chapters:hover { + text-decoration: none; + background-color: var(--theme-hover); + transition: background-color 0.15s, color 0.15s; +} + +.nav-wrapper { + margin-top: 50px; + display: none; +} + +.mobile-nav-chapters { + font-size: 2.5em; + text-align: center; + text-decoration: none; + width: 90px; + border-radius: 5px; + background-color: var(--sidebar-bg); +} + +.previous { + float: left; +} + +.next { + float: right; + right: var(--page-padding); +} + +@media only screen and (max-width: 1080px) { + .nav-wide-wrapper { display: none; } + .nav-wrapper { display: block; } +} + +@media only screen and (max-width: 1380px) { + .sidebar-visible .nav-wide-wrapper { display: none; } + .sidebar-visible .nav-wrapper { display: block; } +} + +/* Inline code */ + +:not(pre) > .hljs { + display: inline; + padding: 0.1em 0.3em; + border-radius: 3px; +} + +:not(pre):not(a) > .hljs { + color: var(--inline-code-color); + overflow-x: initial; +} + +a:hover > .hljs { + text-decoration: underline; +} + +pre { + position: relative; +} +pre > .buttons { + position: absolute; + z-index: 100; + right: 5px; + top: 5px; + + color: var(--sidebar-fg); + cursor: pointer; +} +pre > .buttons :hover { + color: var(--sidebar-active); +} +pre > .buttons i { + margin-left: 8px; +} +pre > .buttons button { + color: inherit; + background: transparent; + border: none; + cursor: inherit; +} +pre > .result { + margin-top: 10px; +} + +/* Search */ + +#searchresults a { + text-decoration: none; +} + +mark { + border-radius: 2px; + padding: 0 3px 1px 3px; + margin: 0 -3px -1px -3px; + background-color: var(--search-mark-bg); + transition: background-color 300ms linear; + cursor: pointer; +} + +mark.fade-out { + background-color: rgba(0,0,0,0) !important; + cursor: auto; +} + +.searchbar-outer { + margin-left: auto; + margin-right: auto; + max-width: var(--content-max-width); +} + +#searchbar { + width: 100%; + margin: 5px auto 0px auto; + padding: 10px 16px; + transition: box-shadow 300ms ease-in-out; + border: 1px solid var(--searchbar-border-color); + border-radius: 3px; + background-color: var(--searchbar-bg); + color: var(--searchbar-fg); +} +#searchbar:focus, +#searchbar.active { + box-shadow: 0 0 3px var(--searchbar-shadow-color); +} + +.searchresults-header { + font-weight: bold; + font-size: 1em; + padding: 18px 0 0 5px; + color: var(--searchresults-header-fg); +} + +.searchresults-outer { + margin-left: auto; + margin-right: auto; + max-width: var(--content-max-width); + border-bottom: 1px dashed var(--searchresults-border-color); +} + +ul#searchresults { + list-style: none; + padding-left: 20px; +} +ul#searchresults li { + margin: 10px 0px; + padding: 2px; + border-radius: 2px; +} +ul#searchresults li.focus { + background-color: var(--searchresults-li-bg); +} +ul#searchresults span.teaser { + display: block; + clear: both; + margin: 5px 0 0 20px; + font-size: 0.8em; +} +ul#searchresults span.teaser em { + font-weight: bold; + font-style: normal; +} + +/* Sidebar */ + +.sidebar { + position: fixed; + left: 0; + top: 0; + bottom: 0; + width: var(--sidebar-width); + font-size: 0.85em; + box-sizing: border-box; + -webkit-overflow-scrolling: touch; + overscroll-behavior-y: contain; + background-color: var(--sidebar-bg); + color: var(--sidebar-fg); +} +.sidebar-resizing { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} +.js:not(.sidebar-resizing) .sidebar { + transition: transform 0.3s; /* Animation: slide away */ +} +.sidebar code { + line-height: 2em; +} +.sidebar .sidebar-scrollbox { + overflow-y: auto; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + padding: 10px 10px; +} +.sidebar .sidebar-resize-handle { + position: absolute; + cursor: col-resize; + width: 0; + right: 0; + top: 0; + bottom: 0; +} +.js .sidebar .sidebar-resize-handle { + cursor: col-resize; + width: 5px; +} +.sidebar-hidden .sidebar { + transform: translateX(calc(0px - var(--sidebar-width))); +} +.sidebar::-webkit-scrollbar { + background: var(--sidebar-bg); +} +.sidebar::-webkit-scrollbar-thumb { + background: var(--scrollbar); +} + +.sidebar-visible .page-wrapper { + transform: translateX(var(--sidebar-width)); +} +@media only screen and (min-width: 620px) { + .sidebar-visible .page-wrapper { + transform: none; + margin-left: var(--sidebar-width); + } +} + +.chapter { + list-style: none outside none; + padding-left: 0; + line-height: 2em; +} + +.chapter ol { + width: 100%; +} + +.chapter li { + display: flex; + color: var(--sidebar-non-existant); +} +.chapter li a { + display: block; + padding: 0; + text-decoration: none; + color: var(--sidebar-fg); +} + +.chapter li a:hover { + color: var(--sidebar-active); +} + +.chapter li a.active { + color: var(--sidebar-active); +} + +.chapter li > a.toggle { + cursor: pointer; + display: block; + margin-left: auto; + padding: 0 10px; + user-select: none; + opacity: 0.68; +} + +.chapter li > a.toggle div { + transition: transform 0.5s; +} + +/* collapse the section */ +.chapter li:not(.expanded) + li > ol { + display: none; +} + +.chapter li.chapter-item { + line-height: 1.5em; + margin-top: 0.6em; +} + +.chapter li.expanded > a.toggle div { + transform: rotate(90deg); +} + +.spacer { + width: 100%; + height: 3px; + margin: 5px 0px; +} +.chapter .spacer { + background-color: var(--sidebar-spacer); +} + +@media (-moz-touch-enabled: 1), (pointer: coarse) { + .chapter li a { padding: 5px 0; } + .spacer { margin: 10px 0; } +} + +.section { + list-style: none outside none; + padding-left: 20px; + line-height: 1.5em; +} + +/* Theme Menu Popup */ + +.theme-popup { + position: absolute; + left: 10px; + top: var(--menu-bar-height); + z-index: 1000; + border-radius: 4px; + font-size: 0.7em; + color: var(--fg); + background: var(--theme-popup-bg); + border: 1px solid var(--theme-popup-border); + margin: 0; + padding: 0; + list-style: none; + display: none; +} +.theme-popup .default { + color: var(--icons); +} +.theme-popup .theme { + width: 100%; + border: 0; + margin: 0; + padding: 2px 10px; + line-height: 25px; + white-space: nowrap; + text-align: left; + cursor: pointer; + color: inherit; + background: inherit; + font-size: inherit; +} +.theme-popup .theme:hover { + background-color: var(--theme-hover); +} +.theme-popup .theme:hover:first-child, +.theme-popup .theme:hover:last-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit; +} diff --git a/css/general.css b/css/general.css new file mode 100644 index 0000000..d98c630 --- /dev/null +++ b/css/general.css @@ -0,0 +1,177 @@ +/* Base styles and content styles */ + +@import 'variables.css'; + +:root { + /* Browser default font-size is 16px, this way 1 rem = 10px */ + font-size: 70%; +} + +html { + font-family: "Open Sans", sans-serif; + color: var(--fg); + background-color: var(--bg); + text-size-adjust: none; +} + +body { + margin: 0; + font-size: 1.5rem; + overflow-x: hidden; +} + +code { + font-family: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace !important; + font-size: 0.9em; /* please adjust the ace font size accordingly in editor.js */ +} + +/* Don't change font size in headers. */ +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + font-size: unset; +} + +.left { float: left; } +.right { float: right; } +.boring { opacity: 0.6; } +.hide-boring .boring { display: none; } +.hidden { display: none !important; } + +h2, h3 { margin-top: 2.5em; } +h4, h5 { margin-top: 2em; } + +.header + .header h3, +.header + .header h4, +.header + .header h5 { + margin-top: 1em; +} + +h1:target::before, +h2:target::before, +h3:target::before, +h4:target::before, +h5:target::before, +h6:target::before { + display: inline-block; + content: "»"; + margin-left: -30px; + width: 30px; +} + +/* This is broken on Safari as of version 14, but is fixed + in Safari Technology Preview 117 which I think will be Safari 14.2. + https://bugs.webkit.org/show_bug.cgi?id=218076 +*/ +:target { + scroll-margin-top: calc(var(--menu-bar-height) + 0.5em); +} + +.page { + outline: 0; + padding: 0 var(--page-padding); + margin-top: calc(0px - var(--menu-bar-height)); /* Compensate for the #menu-bar-hover-placeholder */ +} +.page-wrapper { + box-sizing: border-box; +} +.js:not(.sidebar-resizing) .page-wrapper { + transition: margin-left 0.3s ease, transform 0.3s ease; /* Animation: slide away */ +} + +.content { + overflow-y: auto; + padding: 0 10px; + padding-bottom: 50px; +} +.content main { + margin-left: 4%; + margin-right: 4%; + max-width: var(--content-max-width); +} +.content p { line-height: 1.45em; } +.content ol { line-height: 1.45em; } +.content ul { line-height: 1.45em; } +.content a { text-decoration: none; } +.content a:hover { text-decoration: underline; } +.content img, .content video { max-width: 100%; } +.content .header:link, +.content .header:visited { + color: var(--fg); +} +.content .header:link, +.content .header:visited:hover { + text-decoration: none; +} + +table { + margin: 0 auto; + border-collapse: collapse; +} +table td { + padding: 3px 20px; + border: 1px var(--table-border-color) solid; +} +table thead { + background: var(--table-header-bg); +} +table thead td { + font-weight: 700; + border: none; +} +table thead th { + padding: 3px 20px; +} +table thead tr { + border: 1px var(--table-header-bg) solid; +} +/* Alternate background colors for rows */ +table tbody tr:nth-child(2n) { + background: var(--table-alternate-bg); +} + + +blockquote { + margin: 20px 0; + padding: 0 20px; + color: var(--fg); + background-color: var(--quote-bg); + border-top: .1em solid var(--quote-border); + border-bottom: .1em solid var(--quote-border); +} + + +:not(.footnote-definition) + .footnote-definition, +.footnote-definition + :not(.footnote-definition) { + margin-top: 2em; +} +.footnote-definition { + font-size: 0.9em; + margin: 0.5em 0; +} +.footnote-definition p { + display: inline; +} + +.tooltiptext { + position: absolute; + visibility: hidden; + color: #fff; + background-color: #333; + transform: translateX(-50%); /* Center by moving tooltip 50% of its width left */ + left: -8px; /* Half of the width of the icon */ + top: -35px; + font-size: 0.8em; + text-align: center; + border-radius: 6px; + padding: 5px 8px; + margin: 5px; + z-index: 1000; +} +.tooltipped .tooltiptext { + visibility: visible; +} + +.chapter li.part-title { + color: var(--sidebar-fg); + margin: 5px 0px; + font-weight: bold; +} diff --git a/css/variables.css b/css/variables.css new file mode 100644 index 0000000..a59e197 --- /dev/null +++ b/css/variables.css @@ -0,0 +1,435 @@ + +/* Globals */ + +:root { + --sidebar-width: 255px; + --page-padding: 15px; + --content-max-width: 78%; + --menu-bar-height: 40px; + --pagetoc-width: 12%; + --pagetoc-fontsize: 14.5px; +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +@media only screen and (max-width:1439px) { + :root{ + --content-max-width: 98%; + } +} + +/* Themes */ + +.ayu { + --bg: hsl(210, 25%, 8%); + --fg: #c5c5c5; + + --sidebar-bg: #14191f; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #5c6773; + --sidebar-active: #ffb454; + --sidebar-spacer: #2d334f; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #b7b9cc; + + --links: #0096cf; + + --inline-code-color: #ffb454; + + --theme-popup-bg: #14191f; + --theme-popup-border: #5c6773; + --theme-hover: #191f26; + + --quote-bg: hsl(226, 15%, 17%); + --quote-border: hsl(226, 15%, 22%); + + --table-border-color: hsl(210, 25%, 13%); + --table-header-bg: hsl(210, 25%, 28%); + --table-alternate-bg: hsl(210, 25%, 11%); + + --searchbar-border-color: #848484; + --searchbar-bg: #424242; + --searchbar-fg: #fff; + --searchbar-shadow-color: #d4c89f; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #252932; + --search-mark-bg: #e3b171; +} + +.coal { + --bg: hsl(200, 7%, 8%); + --fg: #98a3ad; + + --sidebar-bg: #292c2f; + --sidebar-fg: #a1adb8; + --sidebar-non-existant: #505254; + --sidebar-active: #3473ad; + --sidebar-spacer: #393939; + + --scrollbar: var(--sidebar-fg); + + --icons: #43484d; + --icons-hover: #b3c0cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6;; + + --theme-popup-bg: #141617; + --theme-popup-border: #43484d; + --theme-hover: #1f2124; + + --quote-bg: hsl(234, 21%, 18%); + --quote-border: hsl(234, 21%, 23%); + + --table-border-color: hsl(200, 7%, 13%); + --table-header-bg: hsl(200, 7%, 28%); + --table-alternate-bg: hsl(200, 7%, 11%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #b7b7b7; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #98a3ad; + --searchresults-li-bg: #2b2b2f; + --search-mark-bg: #355c7d; +} + +.light { + --bg: hsl(0, 0%, 100%); + --fg: hsl(0, 0%, 0%); + + --sidebar-bg: #fafafa; + --sidebar-fg: hsl(0, 0%, 0%); + --sidebar-non-existant: #aaaaaa; + --sidebar-active: #1f1fff; + --sidebar-spacer: #f4f4f4; + + --scrollbar: #8F8F8F; + + --icons: #747474; + --icons-hover: #000000; + + --links: #1f1fff; + + --inline-code-color: #F42C4C; + + --theme-popup-bg: #fafafa; + --theme-popup-border: #cccccc; + --theme-hover: #e6e6e6; + + --quote-bg: hsl(197, 37%, 96%); + --quote-border: hsl(197, 37%, 91%); + + --table-border-color: hsl(0, 0%, 95%); + --table-header-bg: hsl(0, 0%, 80%); + --table-alternate-bg: hsl(0, 0%, 97%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #fafafa; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #e4f2fe; + --search-mark-bg: #a2cff5; +} + +.navy { + --bg: hsl(226, 23%, 11%); + --fg: #bcbdd0; + + --sidebar-bg: #282d3f; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #505274; + --sidebar-active: #2b79a2; + --sidebar-spacer: #2d334f; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #b7b9cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6;; + + --theme-popup-bg: #161923; + --theme-popup-border: #737480; + --theme-hover: #282e40; + + --quote-bg: hsl(226, 15%, 17%); + --quote-border: hsl(226, 15%, 22%); + + --table-border-color: hsl(226, 23%, 16%); + --table-header-bg: hsl(226, 23%, 31%); + --table-alternate-bg: hsl(226, 23%, 14%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #aeaec6; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #5f5f71; + --searchresults-border-color: #5c5c68; + --searchresults-li-bg: #242430; + --search-mark-bg: #a2cff5; +} + +.rust { + --bg: hsl(60, 9%, 87%); + --fg: #262625; + + --sidebar-bg: #3b2e2a; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #505254; + --sidebar-active: #e69f67; + --sidebar-spacer: #45373a; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #262625; + + --links: #2b79a2; + + --inline-code-color: #6e6b5e; + + --theme-popup-bg: #e1e1db; + --theme-popup-border: #b38f6b; + --theme-hover: #99908a; + + --quote-bg: hsl(60, 5%, 75%); + --quote-border: hsl(60, 5%, 70%); + + --table-border-color: hsl(60, 9%, 82%); + --table-header-bg: #b3a497; + --table-alternate-bg: hsl(60, 9%, 84%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #fafafa; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #dec2a2; + --search-mark-bg: #e69f67; +} + +@media (prefers-color-scheme: dark) { + .light.no-js { + --bg: hsl(200, 7%, 8%); + --fg: #98a3ad; + + --sidebar-bg: #292c2f; + --sidebar-fg: #a1adb8; + --sidebar-non-existant: #505254; + --sidebar-active: #3473ad; + --sidebar-spacer: #393939; + + --scrollbar: var(--sidebar-fg); + + --icons: #43484d; + --icons-hover: #b3c0cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6;; + + --theme-popup-bg: #141617; + --theme-popup-border: #43484d; + --theme-hover: #1f2124; + + --quote-bg: hsl(234, 21%, 18%); + --quote-border: hsl(234, 21%, 23%); + + --table-border-color: hsl(200, 7%, 13%); + --table-header-bg: hsl(200, 7%, 28%); + --table-alternate-bg: hsl(200, 7%, 11%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #b7b7b7; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #98a3ad; + --searchresults-li-bg: #2b2b2f; + --search-mark-bg: #355c7d; + } +} diff --git a/decl-macros.html b/decl-macros.html new file mode 100644 index 0000000..66215ea --- /dev/null +++ b/decl-macros.html @@ -0,0 +1,314 @@ + + + + + + 声明宏 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

声明宏

+

本章将介绍 Rust 的声明宏系统:macro_rules!

+

在这一章中有两种不同的介绍,一个 讲思路,另一个 +讲实践

+

前者会向你阐述一个完整而详尽的系统如何工作,而后者将涵盖更多的实际例子。

+

因此,思路介绍 +是为那些只希望声明宏系统作为一个整体得到解释的人而设计的,而 +实践介绍 则指导人们通过实现单个宏。

+

在这两个介绍之后,本章还提供了一些常规且有用的 模式 +和 构件,用于创建功能丰富的声明宏。

+

关于声明宏的其他资源:

+
    +
  1. Rust Book 的宏章节,这是一个更平易近人的高级解释
  2. +
  3. Reference macros-by-example +章节,它更深入而精确地讨论了细节
  4. +
+
+

注意:本书在讨论声明宏时,通常会使用术语 mbe (Macro-By-Example)、 mbe macro 或 +macro_rules!

+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/decl-macros/building-blocks.html b/decl-macros/building-blocks.html new file mode 100644 index 0000000..2ea209a --- /dev/null +++ b/decl-macros/building-blocks.html @@ -0,0 +1,296 @@ + + + + + + 构件 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

构件

+

可重用的宏代码片段 (reusable snippets) 。(也可称作“轮子”)

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/decl-macros/building-blocks/abacus-counting.html b/decl-macros/building-blocks/abacus-counting.html new file mode 100644 index 0000000..97d1dbe --- /dev/null +++ b/decl-macros/building-blocks/abacus-counting.html @@ -0,0 +1,520 @@ + + + + + + 算盘计数 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

算盘计数

+

描述分析

+
+

临时信息:需要更合适的例子。 +该用例采用 Rust 分组机制无法表示的匹配嵌套结构, +实在是过于特殊,因此不适作为例子使用。

+
+
+

注意:此节假设读者已经了解 下推累积 +以及 标记树撕咬机

+
+
macro_rules! abacus {
+    ((- $($moves:tt)*) -> (+ $($count:tt)*)) => {
+        abacus!(($($moves)*) -> ($($count)*))
+    };
+    ((- $($moves:tt)*) -> ($($count:tt)*)) => {
+        abacus!(($($moves)*) -> (- $($count)*))
+    };
+    ((+ $($moves:tt)*) -> (- $($count:tt)*)) => {
+        abacus!(($($moves)*) -> ($($count)*))
+    };
+    ((+ $($moves:tt)*) -> ($($count:tt)*)) => {
+        abacus!(($($moves)*) -> (+ $($count)*))
+    };
+
+    // Check if the final result is zero.
+    (() -> ()) => { true };
+    (() -> ($($count:tt)+)) => { false };
+}
+
+fn main() {
+    let equals_zero = abacus!((++-+-+++--++---++----+) -> ());
+    assert_eq!(equals_zero, true);
+}
+

这个例子所用的技巧用在如下情况: +记录的计数会发生变化,且初始值为零或在零附近,且必须支持如下操作:

+
    +
  • 增加一;
  • +
  • 减少一;
  • +
  • 与 0 (或任何其它固定的有限值)相比较;
  • +
+

数值 n 将由一组共 n 个相同的特定标记来表示。 +对数值的修改操作将采用 下推累积 模式由递归调用完成。 +假设所采用的特定标记是 x ,则上述操作可实现为:

+
    +
  • 增加一:匹配($($count:tt)*)并替换为(x $($count)*)
  • +
  • 减少一:匹配(x $($count:tt)*)并替换为($($count)*)
  • +
  • 与0相比较:匹配()
  • +
  • 与1相比较:匹配(x)
  • +
  • 与2相比较:匹配(x x)
  • +
  • (依此类推...)
  • +
+

作用于计数值的操作将所选的标记来回摆动,如同算盘摆动算子。1

+
1 +

在这句极度单薄的辩解下,隐藏着选用此名称的 真实 理由: +避免造出又一个名含“标记”的术语。今天就该跟你认识的作者谈谈避免 +语义饱和 吧! +公平来讲,本来也可以称它为 +“一元计数(unary counting)”

+
+

在想表示负数的情况下,值 -n 可被表示成 n 个相同的其它标记。 +在上例中,值 +n 被表示成 n+ 标记,而值 -m 被表示成 m- 标记。

+

有负数的情况下操作起来稍微复杂一些, +增减操作在当前数值为负时实际上互换了角色。 +给定 +- 分别作为正数与负数标记,相应操作的实现将变成:

+
    +
  • 增加一: +
      +
    • 匹配 () 并替换为 (+)
    • +
    • 匹配 (- $($count:tt)*) 并替换为 ($($count)*)
    • +
    • 匹配 ($($count:tt)+) 并替换为 (+ $($count)+)
    • +
    +
  • +
  • 减少一: +
      +
    • 匹配 () 并替换为 (-)
    • +
    • 匹配 (+ $($count:tt)*) 并替换为 ($($count)*)
    • +
    • 匹配 ($($count:tt)+) 并替换为 (- $($count)+)
    • +
    +
  • +
  • 与 0 相比较:匹配 ()
  • +
  • 与 +1 相比较:匹配 (+)
  • +
  • 与 -1 相比较:匹配 (-)
  • +
  • 与 +2 相比较:匹配 (++)
  • +
  • 与 -2 相比较:匹配 (--)
  • +
  • (依此类推...)
  • +
+

注意在顶部的示例中,某些规则被合并到一起了 +(举例来说,对 ()($($count:tt)+) 的增加操作被合并为对 +($($count:tt)*) 的增加操作)。

+

如果想要提取出所计数目的实际值,可再使用普通的 +计数宏 。对上例来说,终结规则可换为:

+
macro_rules! abacus {
+    // ...
+
+    // 下列规则将计数替换成实际值的表达式
+    (() -> ()) => {0};
+    (() -> (- $($count:tt)*)) => {
+        - ( count_tts!($( $count_tts:tt )*) )
+    };
+    (() -> (+ $($count:tt)*)) => {
+        count_tts!($( $count_tts:tt )*)
+    };
+}
+
+// 计数一章任选一个宏
+macro_rules! count_tts {
+    // ...
+}
+
+

仅限此例: +严格来说,想要达到此例的效果,没必要做的这么复杂。 +如果你不需要在宏中匹配所计的值,可直接采用重复来更加高效地实现:

+
macro_rules! abacus {
+    (-) => {-1};
+    (+) => {1};
+    ($( $moves:tt )*) => {
+        0 $(+ abacus!($moves))*
+    }
+}
+
+
+

算盘游戏

+
+

译者注:这章原作者的表述实在过于啰嗦,但是这个例子的确很有意思。 +基于这个例子框架,我给出如下浅显而完整的样例代码(可编辑运行):

+
+
macro_rules! abacus {
+    ((- $($moves:tt)*) -> (+ $($count:tt)*)) => {
+        {
+            println!("{} [-]{} | [+]{}", "-+1", stringify!($($moves)*), stringify!($($count)*));
+            abacus!(($($moves)*) -> ($($count)*))
+        }
+    };
+    ((- $($moves:tt)*) -> ($($count:tt)*)) => {
+        {
+            println!("{} [-]{} | - {}", "- 2", stringify!($($moves)*), stringify!($($count)*));
+            abacus!(($($moves)*) -> (- $($count)*))
+        }
+    };
+    ((+ $($moves:tt)*) -> (- $($count:tt)*)) => {
+        {
+            println!("{} [+]{} | [-]{}", "+-3", stringify!($($moves)*), stringify!($($count)*));
+            abacus!(($($moves)*) -> ($($count)*))
+        }
+    };
+    ((+ $($moves:tt)*) -> ($($count:tt)*)) => {
+        {
+            println!("{} [+]{} | + {}", "+ 4", stringify!($($moves)*), stringify!($($count)*));
+            abacus!(($($moves)*) -> (+ $($count)*))
+        }
+    };
+
+    (() -> ()) => {0};
+    (() -> (- $($count:tt)*)) => {{-1 + abacus!(() -> ($($count)*)) }};
+    (() -> (+ $($count:tt)*)) => {{1 + abacus!(() -> ($($count)*)) }};
+}
+
+fn main() {
+    println!("算盘游戏:左边与右边异号时抵消;非异号时,把左边的符号转移到右边;左边无符号时,游戏结束,计算右边得分");
+    println!("图示注解:左右符号消耗情况,分支编号,[消失的符号] 左边情况 | [消失的符号] 右边情况\n");
+
+    println!("计数结果:{}\n", abacus!((++-+-+) -> (--+-+-)));
+    println!("计数结果:{}\n", abacus!((++-+-+) -> (++-+-+)));
+    println!("计数结果:{}\n", abacus!((---+) -> ()));
+    println!("计数结果:{}\n", abacus!((++-+-+) -> ()));
+    println!("计数结果:{}\n", abacus!((++-+-+++--++---++----+) -> ())); // 这是作者给的例子 :)
+}
+

打印结果:

+
算盘游戏:左边与右边异号时抵消;非异号时,把左边的符号转移到右边;左边无符号时,游戏结束,计算右边得分
+图示注解:左右符号消耗情况,分支编号,[消失的符号] 左边情况 | [消失的符号] 右边情况
+
++-3 [+]+ - + - + | [-]- + - + -
++-3 [+]- + - + | [-]+ - + -
+-+1 [-]+ - + | [+]- + -
++-3 [+]- + | [-]+ -
+-+1 [-]+ | [+]-
++-3 [+] | [-]
+计数结果:0
+
++ 4 [+]+ - + - + | + + + - + - +
++ 4 [+]- + - + | + + + + - + - +
+-+1 [-]+ - + | [+]+ + + - + - +
++ 4 [+]- + | + + + + - + - +
+-+1 [-]+ | [+]+ + + - + - +
++ 4 [+] | + + + + - + - +
+计数结果:4
+
+- 2 [-]- - + | - 
+- 2 [-]- + | - -
+- 2 [-]+ | - - -
++-3 [+] | [-]- -
+计数结果:-2
+
++ 4 [+]+ - + - + | + 
++ 4 [+]- + - + | + +
+-+1 [-]+ - + | [+]+
++ 4 [+]- + | + +
+-+1 [-]+ | [+]+
++ 4 [+] | + +
+计数结果:2
+
++ 4 [+]+ - + - + + + - - + + - - - + + - - - - + | + 
++ 4 [+]- + - + + + - - + + - - - + + - - - - + | + +
+-+1 [-]+ - + + + - - + + - - - + + - - - - + | [+]+
++ 4 [+]- + + + - - + + - - - + + - - - - + | + +
+-+1 [-]+ + + - - + + - - - + + - - - - + | [+]+
++ 4 [+]+ + - - + + - - - + + - - - - + | + +
++ 4 [+]+ - - + + - - - + + - - - - + | + + +
++ 4 [+]- - + + - - - + + - - - - + | + + + +
+-+1 [-]- + + - - - + + - - - - + | [+]+ + +
+-+1 [-]+ + - - - + + - - - - + | [+]+ +
++ 4 [+]+ - - - + + - - - - + | + + +
++ 4 [+]- - - + + - - - - + | + + + +
+-+1 [-]- - + + - - - - + | [+]+ + +
+-+1 [-]- + + - - - - + | [+]+ +
+-+1 [-]+ + - - - - + | [+]+
++ 4 [+]+ - - - - + | + +
++ 4 [+]- - - - + | + + +
+-+1 [-]- - - + | [+]+ +
+-+1 [-]- - + | [+]+
+-+1 [-]- + | [+]
+- 2 [-]+ | - 
++-3 [+] | [-]
+计数结果:0
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/decl-macros/building-blocks/ast-coercion.html b/decl-macros/building-blocks/ast-coercion.html new file mode 100644 index 0000000..ba4311c --- /dev/null +++ b/decl-macros/building-blocks/ast-coercion.html @@ -0,0 +1,318 @@ + + + + + + AST 强制转换 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

AST 强制转换

+

在替换 tt 时,Rust 的解析器并不十分可靠。 +当它期望得到某类特定的语法结构时, +如果摆在它面前的是一坨替换后的 tt 标记,就有可能出现问题。 +解析器常常直接选择放弃解析,而非尝试去解析它们。 +在这类情况中,就要用到 AST 强制转换(简称“强转”)。

+
#![allow(dead_code)]
+
+macro_rules! as_expr { ($e:expr) => {$e} }
+macro_rules! as_item { ($i:item) => {$i} }
+macro_rules! as_pat  { ($p:pat)  => {$p} }
+macro_rules! as_stmt { ($s:stmt) => {$s} }
+macro_rules! as_ty   { ($t:ty)   => {$t} }
+
+fn main() {
+    as_item!{struct Dummy;}
+
+    as_stmt!(let as_pat!(_): as_ty!(_) = as_expr!(42));
+}
+

这些强制变换经常与 下推累积 宏一同使用, +以使解析器能够将最终输出的 tt 序列当作某类特定的语法结构来对待。

+

注意:之所以只有这几种强转宏, +是由宏 可以展开成什么 所决定的, +而不是由宏能够捕捉哪些东西所决定的。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/decl-macros/building-blocks/counting.html b/decl-macros/building-blocks/counting.html new file mode 100644 index 0000000..ffc4b9a --- /dev/null +++ b/decl-macros/building-blocks/counting.html @@ -0,0 +1,653 @@ + + + + + + 计数 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

计数

+

反复替换

+

在宏中计数是一项让人吃惊的难搞的活儿。 +最简单的方式是采用反复替换 (repetition with replacement) 。

+
macro_rules! replace_expr {
+    ($_t:tt $sub:expr) => {$sub};
+}
+
+macro_rules! count_tts {
+    ($($tts:tt)*) => {0usize $(+ replace_expr!($tts 1usize))*};
+}
+
+fn main() {
+    assert_eq!(count_tts!(0 1 2), 3);
+}
+

对于小数目来说,这方法不错,但当输入量到达 500 1左右的标记时, +很可能让编译器崩溃。想想吧,输出的结果将类似:

+
0usize + 1usize + /* ~500 `+ 1usize`s */ + 1usize
+

编译器必须把这一大串解析成一棵 AST , +那可会是一棵完美失衡的 500 多级深的二叉树。

+
1 +

译者注:500 这个数据过时了,例子见下面 递归 第三个代码块。

+
+

递归

+

递归 (recursion) 是个老套路。

+
macro_rules! count_tts {
+    () => {0usize};
+    ($_head:tt $($tail:tt)*) => {1usize + count_tts!($($tail)*)};
+}
+
+fn main() {
+    assert_eq!(count_tts!(0 1 2), 3);
+}
+
+

注意:对于 rustc 1.2 来说,很不幸, +编译器在处理大数量的类型未知的整型字面值时将会出现性能问题。 +我们此处显式采用 usize 类型就是为了避免这种不幸。

+

如果这样做并不合适(比如说,当类型必须可替换时), +可通过 as 来减轻问题。(比如, 0 as $ty1 as $ty 等)。

+
+

这方法管用,但很快就会超出宏递归的次数限制( +目前 +是 128 )。

+

与重复替换不同的是,可通过增加匹配分支来增加可处理的输入面值。

+

以下为增加匹配分支的改进代码2,如果把前三个分支注释掉,看看编译器会提示啥 :)

+
macro_rules! count_tts {
+    ($_a:tt $_b:tt $_c:tt $_d:tt $_e:tt
+     $_f:tt $_g:tt $_h:tt $_i:tt $_j:tt
+     $_k:tt $_l:tt $_m:tt $_n:tt $_o:tt
+     $_p:tt $_q:tt $_r:tt $_s:tt $_t:tt
+     $($tail:tt)*)
+        => {20usize + count_tts!($($tail)*)};
+    ($_a:tt $_b:tt $_c:tt $_d:tt $_e:tt
+     $_f:tt $_g:tt $_h:tt $_i:tt $_j:tt
+     $($tail:tt)*)
+        => {10usize + count_tts!($($tail)*)};
+    ($_a:tt $_b:tt $_c:tt $_d:tt $_e:tt
+     $($tail:tt)*)
+        => {5usize + count_tts!($($tail)*)};
+    ($_a:tt
+     $($tail:tt)*)
+        => {1usize + count_tts!($($tail)*)};
+    () => {0usize};
+}
+
+fn main() {
+    assert_eq!(700, count_tts!(
+        ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+        ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+        
+        ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+        ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+        
+        ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+        ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+        
+        ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+        ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+        
+        ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+        ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+        
+        ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+        ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+
+        ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+        ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+    ));
+}
+

可以复制下面的例子运行看看,里面包含递归和反复匹配(代码已隐藏)两种方法。

+
macro_rules! count_tts {
+  ($_a:tt $_b:tt $_c:tt $_d:tt $_e:tt
+   $_f:tt $_g:tt $_h:tt $_i:tt $_j:tt
+   $_k:tt $_l:tt $_m:tt $_n:tt $_o:tt
+   $_p:tt $_q:tt $_r:tt $_s:tt $_t:tt
+   $($tail:tt)*)
+    	=> {20usize + count_tts!($($tail)*)};
+  ($_a:tt $_b:tt $_c:tt $_d:tt $_e:tt
+   $_f:tt $_g:tt $_h:tt $_i:tt $_j:tt
+   $($tail:tt)*)
+    	=> {10usize + count_tts!($($tail)*)};
+  ($_a:tt $_b:tt $_c:tt $_d:tt $_e:tt
+   $($tail:tt)*)
+    	=> {5usize + count_tts!($($tail)*)};
+  ($_a:tt
+   $($tail:tt)*)
+    	=> {1usize + count_tts!($($tail)*)};
+  () => {0usize};
+}
+
+// 可试试“反复替代”的方式计数
+// --snippet--
+// macro_rules! replace_expr {
+//     ($_t:tt $sub:expr) => {
+//         $sub
+//     };
+// }
+//
+// macro_rules! count_tts {
+//     ($($tts:tt)*) => {0usize $(+ replace_expr!($tts 1usize))*};
+// }
+
+fn main() {
+    assert_eq!(2500,
+               count_tts!(
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+
+                   // --snippet-- 
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+                   ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+
+                   // 默认的递归限制让改进的递归代码也无法继续下去了
+                   // 反复替换的代码还能够运行,但明显效率不会很高
+                   // ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+                   // ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,
+               ));
+}
+
2 +

译者注:如果不显式提高 128 的递归限制的话, +这个例子中,增加匹配分支办法可以处理最多 \(20 \times 128 = 2560 \) 个标记。

+
+

切片长度

+

第三种方法,是帮助编译器构建一个深度较小的 AST ,以避免栈溢出。 +可以通过构造数组,并调用其 len 方法来做到。(slice length)

+
macro_rules! replace_expr {
+    ($_t:tt $sub:expr) => {$sub};
+}
+
+macro_rules! count_tts {
+    ($($tts:tt)*) => {<[()]>::len(&[$(replace_expr!($tts ())),*])};
+}
+
+fn main() {
+    assert_eq!(count_tts!(0 1 2), 3);
+
+    const N: usize = count_tts!(0 1 2);
+    let array = [0; N];
+    println!("{:?}", array);
+}
+

经过测试,这种方法可处理高达 10000 个标记数,可能还能多上不少。3

+

而且可以用于常量表达式,比如当作在 const 值或定长数组的长度值。4

+

所以基本上此方法是 首选

+
3 +

译者注:这个具体的数据可能也过时了,但这个方法的确是高效的。

+
+
4 +

译者注:原作时这个方法无法用于常量,现在无此限制。

+
+

枚举计数

+

当你需要统计 互不相同的标识符 的数量时, +可以利用枚举体的 +numeric cast +功能来达到统计成员(即标识符)个数。

+
macro_rules! count_idents {
+    ($($idents:ident),* $(,)*) => {
+        {
+            #[allow(dead_code, non_camel_case_types)]
+            enum Idents { $($idents,)* __CountIdentsLast } 
+            const COUNT: u32 = Idents::__CountIdentsLast as u32;
+            COUNT
+        }
+    };
+}
+
+fn main() {
+    const COUNT: u32 = count_idents!(A, B, C);
+    assert_eq!(COUNT, 3);
+}
+

此方法有两大缺陷:

+
    +
  1. 它仅能被用于数有效的标识符(同时还不能是关键词),而且不允许那些标识符有重复
  2. +
  3. 不具备卫生性:如果你的末位标识符(在 __CountIdentsLast5 位置上的标识符)的字面值也是输入之一, +那么宏调用就会失败,因为 enum 中包含重复变量。
  4. +
+
5 +

译者注:__CountIdentsLast 只是一个自定义的标识符,重点在于它处于枚举成员的最后一位。

+
+

bit twiddling

+

另一个递归方法,但是使用了 位操作 (bit operations) 6

+
macro_rules! count_tts {
+    () => { 0 };
+    ($odd:tt $($a:tt $b:tt)*) => { (count_tts!($($a)*) << 1) | 1 };
+    ($($a:tt $even:tt)*) => { count_tts!($($a)*) << 1 };
+}
+
+fn main() {
+    assert_eq!(count_tts!(0 1 2), 3);
+}
+

这种方法非常聪明。 +只要它是偶数个,就能有效地将其输入减半, +然后将计数器乘以 2(或者在这种情况下,向左移1位)。 +因为由于前一次左移位,此时最低位必须为 0 ,重复直到我们达到基本规则 () => 0 。 +如果输入是奇数个,则从第二个输入开始减半,最终将结果进行 或运算(这等效于加 1)。

+

这样做的好处是,生成计数器的 AST 表达式将以 O(log(n)) 而不是 O(n) 复杂度增长。 +请注意,这仍然可能达到递归限制。

+

让我们手动分析中间的过程:

+
count_tts!(0 0 0 0 0 0 0 0 0 0);
+

由于我们的标记树数量为偶数(10),因此该调用将与第三条规则匹配。 +该匹配分支把奇数项的标记树命名给 $a ,偶数项的标记树命名成 $b , +但是只会对奇数项 $a 展开,这意味着有效地抛弃所有偶数项,切断了一半的输入。 +因此,调用现在变为:

+
count_tts!(0 0 0 0 0) << 1;
+

现在,该调用将匹配第二条规则,因为其输入的令牌树数量为奇数。 +在这种情况下,第一个标记树将被丢弃以再次让输入变成偶数个, +然后可以在调用中再次进行减半步骤。 +此时,我们可以将奇数时丢弃的一项计数为1,然后再乘以2,因为我们也减半了。

+
((count_tts!(0 0) << 1) | 1) << 1;
+
((count_tts!(0) << 1 << 1) | 1) << 1;
+
(((count_tts!() | 1) << 1 << 1) | 1) << 1;
+
((((0 << 1) | 1) << 1 << 1) | 1) << 1;
+

现在,要检查是否正确分析了扩展过程, +我们可以使用 debugging 调试工具。 +展开宏后,我们应该得到:

+
((((0 << 1) | 1) << 1 << 1) | 1) << 1;
+

没有任何差错,太棒了!

+
+

译者注:以下内容为译者自行补充这小节提到的调试。 +注意:我这里使用的加、乘运算与上面提到的位运算是一样的。

+
+
#![allow(unused)]
+macro_rules! count_tts {
+    () => { 0 };
+    ($odd:tt $($a:tt $b:tt)*) => { (count_tts!($($a)*) *2) + 1 };
+    ($($a:tt $even:tt)*) => { count_tts!($($a)*) *2 };
+}
+
+fn main() {
+    count_tts!(0 1 2 3 4 5 6 7 8 9 10);
+}
+

调试方法(必须在 nightly 版本下):

+
    +
  1. 使用编译命令 cargo rustc -- -Z trace-macros +得到:
  2. +
+
note: trace_macro
+ --> src/main.rs:9:5
+  |
+9 |     count_tts!(0 1 2 3 4 5 6 7 8 9 10);
+  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+  |
+  = note: expanding `count_tts! { 0 1 2 3 4 5 6 7 8 9 10 }`
+  = note: to `(count_tts! (1 3 5 7 9) * 2) + 1`
+  = note: expanding `count_tts! { 1 3 5 7 9 }`
+  = note: to `(count_tts! (3 7) * 2) + 1`
+  = note: expanding `count_tts! { 3 7 }`
+  = note: to `count_tts! (3) * 2`
+  = note: expanding `count_tts! { 3 }`
+  = note: to `(count_tts! () * 2) + 1`
+  = note: expanding `count_tts! {  }`
+  = note: to `0`
+
+
    +
  1. 上面的形式太不简洁,所以使用封装好的工具:cargo-expand。 +使用编译命令 cargo expand ,得到:
  2. +
+
#![feature(prelude_import)]
+#![allow(unused)]
+#[prelude_import]
+use std::prelude::rust_2018::*;
+#[macro_use]
+extern crate std;
+fn main() {
+    (((((0 * 2) + 1) * 2 * 2) + 1) * 2) + 1;
+}
+
+
6 +

这种方法的归功于 Reddit 用户 +YatoRust

+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/decl-macros/building-blocks/parsing.html b/decl-macros/building-blocks/parsing.html new file mode 100644 index 0000000..d36ff50 --- /dev/null +++ b/decl-macros/building-blocks/parsing.html @@ -0,0 +1,507 @@ + + + + + + 解析 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

解析 Rust

+

在有些情况下解析某些 Rust items 会很有用。 +这一章会展示一些能够解析 Rust 中更复杂的 items 的宏。

+

这些宏目的不是解析整个 items 语法,而是解析通用、有用的部分, +解析的方式也不会太复杂。 +也就是说,我们不会涉及解析 泛型 之类的东西。

+

重点在于宏的匹配方式 (matchers) ;展开的部分 ( Reference 里使用的术语叫做 transcribers ), +仅仅用作例子,不需要特别关心它。

+

函数

+
macro_rules! function_item_matcher {
+    (
+
+        $( #[$meta:meta] )*
+    //  ^~~~attributes~~~~^
+        $vis:vis fn $name:ident ( $( $arg_name:ident : $arg_ty:ty ),* $(,)? )
+    //                          ^~~~~~~~~~~~~~~~argument list!~~~~~~~~~~~~~~^
+            $( -> $ret_ty:ty )?
+    //      ^~~~return type~~~^
+            { $($tt:tt)* }
+    //      ^~~~~body~~~~^
+    ) => {
+        $( #[$meta] )*
+        $vis fn $name ( $( $arg_name : $arg_ty ),* ) $( -> $ret_ty )? { $($tt)* }
+    }
+}
+
+function_item_matcher!(
+   #[inline]
+   #[cold]
+   pub fn foo(bar: i32, baz: i32, ) -> String {
+       format!("{} {}", bar, baz)
+   }
+);
+
+fn main() {
+    assert_eq!(foo(13, 37), "13 37");
+}
+

这是一个简单的匹配函数的例子, +传入宏的函数不能包含 unsafeasync、泛型和 where 语句。 +如果需要解析这些内容,则最好使用 proc-macro (过程宏) 代替。

+

这个例子可以检查函数签名,从中生成一些额外的东西, +然后再重新返回 (re-emit) 整个函数。 +有点像 Derive 过程宏,虽然功能没那么强大,但是是为函数服务的 +( Derive 不作用于函数)。

+
+

理想情况下,我们对参数捕获宁愿使用 pat 分类符,而不是 ident 分类符, +但这里目前不被允许(因为前者的跟随限制,不允许其后使用 : )。 +幸好在函数签名里面不常使用模式 ( pat ) ,所以这个例子还不错。

+
+

方法

+

有时我们想解析方法 (methods),方法就是通过 self 的某种形式指向对象的函数。 +这让事情变得棘手多了。

+
+

WIP (待完善)

+
+

结构体

+
macro_rules! struct_item_matcher {
+    // Unit-Struct
+    (
+        $( #[$meta:meta] )*
+    //  ^~~~attributes~~~~^
+        $vis:vis struct $name:ident;
+    ) => {
+        $( #[$meta] )*
+        $vis struct $name;
+    };
+
+    // Tuple-Struct
+    (
+        $( #[$meta:meta] )*
+    //  ^~~~attributes~~~~^
+        $vis:vis struct $name:ident (
+            $(
+                $( #[$field_meta:meta] )*
+    //          ^~~~field attributes~~~~^
+                $field_vis:vis $field_ty:ty
+    //          ^~~~~~a single field~~~~~~^
+            ),*
+        $(,)? );
+    ) => {
+        $( #[$meta] )*
+        $vis struct $name (
+            $(
+                $( #[$field_meta] )*
+                $field_vis $field_ty
+            ),*
+        );
+    };
+
+    // Named-Struct
+    (
+        $( #[$meta:meta] )*
+    //  ^~~~attributes~~~~^
+        $vis:vis struct $name:ident {
+            $(
+                $( #[$field_meta:meta] )*
+    //          ^~~~field attributes~~~!^
+                $field_vis:vis $field_name:ident : $field_ty:ty
+    //          ^~~~~~~~~~~~~~~~~a single field~~~~~~~~~~~~~~~^
+            ),*
+        $(,)? }
+    ) => {
+        $( #[$meta] )*
+        $vis struct $name {
+            $(
+                $( #[$field_meta] )*
+                $field_vis $field_name : $field_ty
+            ),*
+        }
+    }
+}
+
+struct_item_matcher!(
+   #[allow(dead_code)]
+   #[derive(Copy, Clone)]
+   pub(crate) struct Foo { 
+      pub bar: i32,
+      baz: &'static str,
+      qux: f32
+   }
+);
+struct_item_matcher!(
+   #[derive(Copy, Clone)]
+   pub(crate) struct Bar;
+);
+struct_item_matcher!(
+   #[derive(Clone)]
+   pub(crate) struct Baz (i32, pub f32, String);
+);
+fn main() {
+   let _: Foo = Foo { bar: 42, baz: "macros can be nice", qux: 3.14, };
+   let _: Bar = Bar;
+   let _: Baz = Baz(2, 0.1234, String::new());
+}
+

枚举体

+

解析枚举体比解析结构体更复杂一点,所以会用上 模式 这章讨论的技巧: +TT 撕咬机内用规则

+

不是重新构造被解析的枚举体,而是只访问枚举体所有的标记 (tokens), +因为重构枚举体将需要我们再通过 下推累积 +临时组合所有已解析的标记 (tokens) 。

+
macro_rules! enum_item_matcher {
+    // tuple variant
+    (@variant $variant:ident (
+        $(
+            $( #[$field_meta:meta] )*
+    //      ^~~~field attributes~~~~^
+            $field_vis:vis $field_ty:ty
+    //      ^~~~~~a single field~~~~~~^
+        ),* $(,)?
+    //∨~~rest of input~~∨
+    ) $(, $($tt:tt)* )? ) => {
+
+        // process rest of the enum
+        $( enum_item_matcher!(@variant $( $tt )*); )?
+    };
+
+    // named variant
+    (@variant $variant:ident {
+        $(
+            $( #[$field_meta:meta] )*
+    //      ^~~~field attributes~~~!^
+            $field_vis:vis $field_name:ident : $field_ty:ty
+    //      ^~~~~~~~~~~~~~~~~a single field~~~~~~~~~~~~~~~^
+        ),* $(,)?
+    //∨~~rest of input~~∨
+    } $(, $($tt:tt)* )? ) => {
+        // process rest of the enum
+        $( enum_item_matcher!(@variant $( $tt )*); )?
+    };
+
+    // unit variant
+    (@variant $variant:ident $(, $($tt:tt)* )? ) => {
+        // process rest of the enum
+        $( enum_item_matcher!(@variant $( $tt )*); )?
+    };
+
+    // trailing comma
+    (@variant ,) => {};
+    // base case
+    (@variant) => {};
+
+    // entry point
+    (
+        $( #[$meta:meta] )*
+        $vis:vis enum $name:ident {
+            $($tt:tt)*
+        }
+    ) => {
+        enum_item_matcher!(@variant $($tt)*);
+    };
+}
+
+enum_item_matcher!(
+    #[derive(Copy, Clone)]
+    pub(crate) enum Foo {
+        Bar,
+        Baz,
+    }
+);
+enum_item_matcher!(
+    #[derive(Copy, Clone)]
+    pub(crate) enum Bar {
+        Foo(i32, f32),
+        Bar,
+        Baz(),
+    }
+);
+enum_item_matcher!(
+    #[derive(Clone)]
+    pub(crate) enum Baz {}
+);
+
+fn main() {}
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/decl-macros/macros-methodical.html b/decl-macros/macros-methodical.html new file mode 100644 index 0000000..f7499d3 --- /dev/null +++ b/decl-macros/macros-methodical.html @@ -0,0 +1,510 @@ + + + + + + 思路 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

思路介绍

+

这一节会介绍 Rust 的声明宏系统,解释该系统如何作为整体运作。

+

首先会深入构造语法及其关键部分,然后介绍你至少应该了解的通用信息。

+

macro_rules!

+

有了前述知识,我们终于可以介绍 macro_rules! 了。如前所述,macro_rules! +本身就是一个语法扩展,也就是从技术上说,它并不是 Rust 语法的一部分。它的形式如下:

+
macro_rules! $name {
+    $rule0 ;
+    $rule1 ;
+    // …
+    $ruleN ;
+}
+

至少得有一条规则,而且最后一条规则后面的分号可被省略。规则里你可以使用大/中/小括号: +{}[]()1。每条“规则”都形如:

+
    ($matcher) => {$expansion}
+
+
1 +

译者注:它们的英文名称有时候很重要,因为如果你不认识英文名称的话,会比较难读懂文档(比如 +syn)。braces {}、brackets []、parentheses ()

+
+

分组符号可以是任意一种括号,但处于习惯,在模式匹配 (matcher) 外侧使用小括号、展开 +(expansion 也可以叫做 transcriber) 外侧使用大括号。

+

注意:在规则里选择哪种括号并不会影响宏调用。

+

而且,实际上,你也可以在调用宏时使用这三种中任意一种括号,只不过使用 { ... } 或者 ( ... ); +的话会有所不同(关注点在于末尾跟随的分号 ; )。有末尾分号的宏调用总是会被解析成一个条目 (item)。

+

如果你好奇的话,macro_rules! 的调用将被展开成什么?答案是:空 (nothing)。至少,在 AST +中它被展开为空。它所影响的是编译器内部的结构,以将该宏注册 (register) +进去。因此,技术上讲你可以在任何一个空展开合法的位置使用 macro_rules!

+
+

译者注:这里提到两种情况,定义声明宏和使用(或者说调用)声明宏。而且,在括号的选取上:

+
    +
  1. 定义的规则不关心 ($matcher) => {$expansion} 中的外层括号类型,但 matcher 和 expansion +之内的括号属于匹配和展开的内容,所以它们内部使用什么括号取决于你需要什么语法。
  2. +
  3. 假如使用 m! 这个宏,如果该宏展开成条目,则必须使用 m! { ... } 或者 m!( ... );; +如果该宏展开成表达式,你可以使用 m! { ... } 或者 m!( ... ) 或者 m![ ... ]
  4. +
  5. 实际上,定义宏的括号遵循习惯就好,而使用宏的括号用错的话,只需仔细阅读编译器给你的错误信息,和以上第 +2 点,就知道怎么改了。
  6. +
+
+

匹配

+

当一个宏被调用时,macro_rules! 解释器将按照声明顺序一一检查规则。

+

对每条规则,它都将尝试将输入标记树的内容与该规则的 matcher 进行匹配。某个 matcher 2 +必须与输入完全匹配才被认为是一次匹配。

+
2 +

译者注:为了简单起见,我不翻译 matcher 这个术语,它指的是被匹配的部分,也就是声明宏规则的前半段。

+
+

如果输入与某个 matcher 相匹配,则该调用将替换成相应的展开内容 (expansion) ;否则,将尝试匹配下条规则。

+

如果所有规则均匹配失败,则宏展开失败并报错。

+

最简单的例子是空 matcher:

+
macro_rules! four {
+    () => { 1 + 3 };
+}
+

当且仅当匹配到空的输入时,匹配成功,即 four!()four![]four!{} 三种方式调用是匹配成功的 。

+

注意所用的分组标记并不需要匹配定义时采用的分组标记,因为实际上分组标记并未传给调用。

+

也就是说,你可以通过 four![] 调用上述宏,此调用仍将被视作匹配成功。只有输入的内容才会被纳入匹配考量范围。

+

matcher 中也可以包含字面上3的标记树,这些标记树必须被完全匹配。将整个对应标记树在相应位置写下即可。

+

比如,要匹配标记序列 4 fn ['spang "whammo"] @_@ ,我们可以这样写:

+
macro_rules! gibberish {
+    (4 fn ['spang "whammo"] @_@) => {...};
+}
+

使用 gibberish!(4 fn ['spang "whammo"] @_@]) 即可成功匹配和调用。

+

你能写出什么标记树,就可以使用什么标记树。

+
3 +

译者注:这里不是指 Rust 的“字面值”,而是指不考虑含义的标记,比如这个例子中 fn[]都不是 +Rust 的 literal 标记 (token),而是 keyworddelimiter +标记,或者从下面谈到的元变量角度看,它们可以ident 或者 tt 分类符捕获。

+
+

元变量

+

matcher 还可以包含捕获 (captures)。即基于某种通用语法类别来匹配输入,并将结果捕获到元变量 (metavariable) +中,然后将替换元变量到输出。

+

捕获的书写方式是:先写美元符号 $,然后跟一个标识符,然后是冒号 :,最后是捕获方式,比如 $e:expr

+

捕获方式又被称作“片段分类符” (fragment-specifier),必须是以下一种:

+
    +
  • block:一个块(比如一块语句或者由大括号包围的一个表达式)
  • +
  • expr:一个表达式 (expression)
  • +
  • ident:一个标识符 (identifier),包括关键字 (keywords)
  • +
  • item:一个条目(比如函数、结构体、模块、impl 块)
  • +
  • lifetime:一个生命周期注解(比如 'foo'static
  • +
  • literal:一个字面值(比如 "Hello World!"3.14'🦀'
  • +
  • meta:一个元信息(比如 #[...]#![...] 属性内部的东西)
  • +
  • pat:一个模式 (pattern)
  • +
  • path:一条路径(比如 foo::std::mem::replacetransmute::<_, int>
  • +
  • stmt:一条语句 (statement)
  • +
  • tt:单棵标记树
  • +
  • ty:一个类型
  • +
  • vis:一个可能为空的可视标识符(比如 pubpub(in crate)
  • +
+

关于片段分类符更深入的描述请阅读本书的片段分类符一章。

+

比如以下声明宏捕获一个表达式输入到元变量 $e

+
macro_rules! one_expression {
+    ($e:expr) => {...};
+}
+

元变量对 Rust 编译器的解析器产生影响,而解析器也会确保元变量总是被“正确无误”地解析。

+

expr 元变量总是捕获完整且符合 Rust 编译版本的表达式。

+

你可以在有限的情况下同时结合字面上的标记树和元变量。(见 Metavariables and Expansion Redux 一节)

+

当元变量已经在 matcher 中确定之后,你只需要写 $name 就能引用元变量。比如:

+
macro_rules! times_five {
+    ($e:expr) => { 5 * $e };
+}
+

元变量被替换成完整的 AST 节点,这很像宏展开。这也意味着被 $e +捕获的任何标记序列都会被解析成单个完整的表达式。

+

你也可以一个 matcher 中捕获多个元变量:

+
macro_rules! multiply_add {
+    ($a:expr, $b:expr, $c:expr) => { $a * ($b + $c) };
+}
+

然后在 expansion 中使用任意次数的元变量:

+
macro_rules! discard {
+    ($e:expr) => {};
+}
+macro_rules! repeat {
+    ($e:expr) => { $e; $e; $e; };
+}
+

有一个特殊的元变量叫做 $crate ,它用来指代当前 crate 。

+

反复

+

matcher 可以有反复捕获 (repetition),这使得匹配一连串标记 (token) +成为可能。反复捕获的一般形式为 $ ( ... ) sep rep

+
    +
  • $ 是字面上的美元符号标记
  • +
  • ( ... ) 是被反复匹配的模式,由小括号包围。
  • +
  • sep可选的分隔标记。它不能是括号或者反复操作符 rep。常用例子有 ,;
  • +
  • rep必须的重复操作符。当前可以是: +
      +
    • ?:表示最多一次重复,所以此时不能前跟分隔标记。
    • +
    • *:表示零次或多次重复。
    • +
    • +:表示一次或多次重复。
    • +
    +
  • +
+

反复捕获中可以包含任意其他的有效 matcher,比如字面上的标记树、元变量以及任意嵌套的反复捕获。

+

在 expansion 中,使用被反复捕获的内容时,也采用相同的语法。而且被反复捕获的元变量只能存在于反复语法内。

+

举例来说,下面这个宏将每一个元素转换成字符串:它先匹配零或多个由逗号分隔的表达式,并分别将它们构造成 +Vec 的表达式。

+
macro_rules! vec_strs {
+    (
+        // 开始反复捕获
+        $(
+            // 每个反复必须包含一个表达式
+            $element:expr
+        )
+        // 由逗号分隔
+        ,
+        // 0 或多次
+        *
+    ) => {
+        // 在这个块内用大括号括起来,然后在里面写多条语句
+        {
+            let mut v = Vec::new();
+
+            // 开始反复捕获
+            $(
+                // 每个反复会展开成下面表达式,其中 $element 被换成相应被捕获的表达式
+                v.push(format!("{}", $element));
+            )*
+
+            v
+        }
+    };
+}
+
+fn main() {
+    let s = vec_strs![1, "a", true, 3.14159f32];
+    assert_eq!(s, &["1", "a", "true", "3.14159"]);
+}
+

你可以在一个反复语句里面使用多次和多个元变量,只要这些元变量以相同的次数重复。所以下面的宏代码正常运行:

+
macro_rules! repeat_two {
+    ($($i:ident)*, $($i2:ident)*) => {
+        $( let $i: (); let $i2: (); )*
+    }
+}
+
+fn main () {
+    repeat_two!( a b c d e f, u v w x y z );
+}
+

但是这下面的不能运行:

+
macro_rules! repeat_two {
+    ($($i:ident)*, $($i2:ident)*) => {
+        $( let $i: (); let $i2: (); )*
+    }
+}
+
+fn main() {
+    repeat_two!( a b c d e f, x y z );
+}
+

运行报以下错误:

+
error: meta-variable `i` repeats 6 times, but `i2` repeats 3 times
+ --> src/main.rs:6:10
+  |
+6 |         $( let $i: (); let $i2: (); )*
+  |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+

元变量表达式

+
+

RFC: rfcs#1584

+

Tracking Issue: rust#83527

+

Feature: #![feature(macro_metavar_expr)]

+
+

transcriber4 可以包含所谓的元变量表达 (metavariable expressions)。

+

元变量表达式为 transcriber 提供了关于元变量的信息 —— 这些信息是不容易获得的。

+

目前除了 $$ 表达式外,它们的一般形式都是 $ { op(...) }:即除了 $$ 以外的所有元变量表达式都涉及反复。

+

可以使用以下表达式(其中 ident 是所绑定的元变量的名称,而 depth 是整型字面值):

+
    +
  • ${count(ident)}:最里层反复 $ident 的总次数,相当于 ${count(ident, 0)}
  • +
  • ${count(ident,depth)}:第 depth 层反复 $ident 的次数
  • +
  • ${index()}:最里层反复的当前反复的索引,相当于 ${index(0)}
  • +
  • ${index(depth)}:在第 depth 层处当前反复的索引,向外计数
  • +
  • ${length()}:最里层反复的重复次数,相当于 ${length(0)}
  • +
  • ${length(depth)}:在第 depth 层反复的次数,向外计数
  • +
  • ${ignore(ident)}:绑定 $ident 进行重复,并展开成空
  • +
  • $$:展开为单个 $,这会有效地转义 $ 标记,因此它不会被展开(转写)
  • +
+
4 +

即 expansion,指展开的部分,是每条声明宏规则的后半段。

+
+
+

 

+

想了解完整的定义语法,可以参考 Rust Reference 书的 Macros By Example 一章。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/decl-macros/macros-practical-table.html b/decl-macros/macros-practical-table.html new file mode 100644 index 0000000..d1491dc --- /dev/null +++ b/decl-macros/macros-practical-table.html @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PositionInputinitsrecur
a[n] = $($inits:expr),+ , ... , $recur:expr + a[n] = 0, 1, ..., a[n-1] + a[n-2]
a[n] = $($inits:expr),+ , ... , $recur:expr + [n] = 0, 1, ..., a[n-1] + a[n-2]
a[n] = $($inits:expr),+ , ... , $recur:expr + n] = 0, 1, ..., a[n-1] + a[n-2]
a[n] = $($inits:expr),+ , ... , $recur:expr + ] = 0, 1, ..., a[n-1] + a[n-2]
a[n] = $($inits:expr),+ , ... , $recur:expr + = 0, 1, ..., a[n-1] + a[n-2]
a[n] = $($inits:expr),+ , ... , $recur:expr + 0, 1, ..., a[n-1] + a[n-2]
a[n] = $($inits:expr),+ , ... , $recur:expr + 0, 1, ..., a[n-1] + a[n-2]
a[n] = $($inits:expr),+ , ... , $recur:expr + ⌂ ⌂, 1, ..., a[n-1] + a[n-2]0
+ 注意: 这有两个 `⌂` ,因为下个输入标记既能匹配 重复元素间的分隔符逗号,也能匹配 标志重复结束的逗号。宏系统将同时追踪这两种可能,直到决定具体选择为止。 +
a[n] = $($inits:expr),+ , ... , $recur:expr + ⌂ ⌂1, ..., a[n-1] + a[n-2]0
a[n] = $($inits:expr),+ , ... , $recur:expr + , ..., a[n-1] + a[n-2]0, 1
+ 注意:第一个被划掉的记号表明, + 基于上个被消耗的标记,宏系统排除了一项先前存在的可能。 +
a[n] = $($inits:expr),+ , ... , $recur:expr + ..., a[n-1] + a[n-2]0, 1
a[n] = $($inits:expr),+ , ... , $recur:expr + , a[n-1] + a[n-2]0, 1
a[n] = $($inits:expr),+ , ... , $recur:expr + a[n-1] + a[n-2]0, 1
a[n] = $($inits:expr),+ , ... , $recur:expr + 0, 1a[n-1] + a[n-2]
+ 注意:这一步表明,类似 $recur:expr + 的绑定将消耗一个完整的表达式。 + 究竟什么算是一个完整的表达式,将由编译器决定。 + 稍后我们会谈到语言其它部分的类似行为。 +
diff --git a/decl-macros/macros-practical.html b/decl-macros/macros-practical.html new file mode 100644 index 0000000..9b76ff7 --- /dev/null +++ b/decl-macros/macros-practical.html @@ -0,0 +1,1668 @@ + + + + + + 实战 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

实战篇

+

本章节将通过一个相对简单、实际的例子来介绍 Rust 的宏系统。 +我们不会试图解释整个宏系统错综复杂的构造; +而是试图让读者能够舒适地了解宏的书写方式,以及为何如斯。

+

在 Rust Book 中也有专门一章 讲解宏 +(中文版), +同样提供了高层面的讲解。 +此外,本书也有一章 更富条理的介绍,旨在详细阐释宏系统。

+
+

译者注:建议初学者跟着文章思路一步步走下去, +从看懂文字说明和样例代码开始,能够运行的代码块运行一遍,看看效果。 +把样例代码复制出来跟着文章的说明依次更改。哪一步没跟上,就点右上角的展开按钮; +或者复制按钮,获取未隐藏的代码。

+
+

一点背景知识

+
+

注意:别慌!我们通篇只会涉及到下面这一点点数学。如果想直接看重点,本小节可被安全跳过。

+
+

所谓“递推 (recurrence) 关系”是指这样一个序列, +其中的每个值都由先前的一个或多个值决定, +并最终由一个或多个初始值完全决定。 +举例来说,Fibonacci 数列 +可被定义为如下关系:

+

\[ F_{n} = 0, 1, ..., F_{n-1} + F_{n-2}\]

+

即序列的前两个数分别为 0 和 1,而第 3 个则为 +\( F_{0} + F_{1} = 0 + 1 = 1\),第 4 个则为 \( F_{1} + F_{2} = 1 + 1 = 2\) +,依此类推。

+

由于这列值可以永远持续下去,定义一个 fibonacci 的求值函数略显困难。 +显然,返回一整列值并不实际。 +我们真正需要的,应是某种具有惰求值性质的东西——只在必要的时候才进行运算求值。

+

在 Rust 中,这样的需求表明,是 Iterator 派上用场的时候了。 +实现迭代器并不十分困难,但比较繁琐: +你得自定义一个类型,弄明白该在其中存储什么,然后为它实现 Iterator trait。

+

其实,递推关系足够简单; +几乎所有的递推关系都可被抽象出来,变成一小段由宏驱动的代码生成机制。

+

好了,说得已经足够多了,让我们开始干活吧。

+

构建过程

+

通常来说,在编写新宏时,我所做的第一件事,是决定宏调用的形式。 +在我们当前所讨论的情况下,我的初次尝试是这样:

+
let fib = recurrence![a[n] = 0, 1, ..., a[n-1] + a[n-2]];
+
+for e in fib.take(10) { println!("{}", e) }
+

以此为基点,我们可以向宏的定义迈出第一步, +即便在此时我们尚不了解该宏的展开部分究竟是什么样子。 +此步骤的用处在于,如果在此处无法明确如何解析输入语法, +那就可能意味着,整个宏的构思需要改变。

+
macro_rules! recurrence {
+    ( a[n] = $($inits:expr),+ , ... , $recur:expr ) => { /* ... */ };
+}
+fn main() {}
+

假设你并不熟悉相应的语法,让我来解释。 +上述代码块使用 macro_rules! 系统定义了一个宏,称为 recurrence! 。 +此宏仅包含一条解析规则,它规定,宏的输入必须依次匹配:

+
    +
  • 一段字面标记序列,a [ n ] =
  • +
  • 一段 重复 的序列($( ... )),其内元素由,分隔,允许重复一或多次( + ); +重复的内容允许: +
      +
    • 一个有效的 表达式,它将被捕获至 元变量 inits ($inits:expr)
    • +
    +
  • +
  • 又一段字面标记序列 , ... ,
  • +
  • 一个有效的 表达式,将被捕获至 元变量 recur ($recur:expr)。
  • +
+

最后,规则表明,如果输入被成功匹配,则对该宏的调用将被标记序列 /* ... */ 替换。

+

值得注意的是,inits,如它命名采用的复数形式所暗示的, +实际上包含所有成功匹配进此重复的表达式,而不仅是第一或最后一个。 +不仅如此,它们将被捕获成一个序列,而不是把它们不可逆地拼接在一起。

+

作为练习,我们将采用上面提及的输入,并研究它被处理的过程。 +由 标出的“位置”将揭示下一个需要被匹配的句法模式。 +注意在某些情况下,下一个可用元素可能存在多个。

+

Input 表示所有尚未被消耗的标记。 +initsrecur 分别表示其对应绑定的内容。

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PositionInputinitsrecur
a[n] = $($inits:expr),+ , ... , $recur:expr + a[n] = 0, 1, ..., a[n-1] + a[n-2]
a[n] = $($inits:expr),+ , ... , $recur:expr + [n] = 0, 1, ..., a[n-1] + a[n-2]
a[n] = $($inits:expr),+ , ... , $recur:expr + n] = 0, 1, ..., a[n-1] + a[n-2]
a[n] = $($inits:expr),+ , ... , $recur:expr + ] = 0, 1, ..., a[n-1] + a[n-2]
a[n] = $($inits:expr),+ , ... , $recur:expr + = 0, 1, ..., a[n-1] + a[n-2]
a[n] = $($inits:expr),+ , ... , $recur:expr + 0, 1, ..., a[n-1] + a[n-2]
a[n] = $($inits:expr),+ , ... , $recur:expr + 0, 1, ..., a[n-1] + a[n-2]
a[n] = $($inits:expr),+ , ... , $recur:expr + ⌂ ⌂, 1, ..., a[n-1] + a[n-2]0
+ 注意: 这有两个 `⌂` ,因为下个输入标记既能匹配 重复元素间的分隔符逗号,也能匹配 标志重复结束的逗号。宏系统将同时追踪这两种可能,直到决定具体选择为止。 +
a[n] = $($inits:expr),+ , ... , $recur:expr + ⌂ ⌂1, ..., a[n-1] + a[n-2]0
a[n] = $($inits:expr),+ , ... , $recur:expr + , ..., a[n-1] + a[n-2]0, 1
+ 注意:第一个被划掉的记号表明, + 基于上个被消耗的标记,宏系统排除了一项先前存在的可能。 +
a[n] = $($inits:expr),+ , ... , $recur:expr + ..., a[n-1] + a[n-2]0, 1
a[n] = $($inits:expr),+ , ... , $recur:expr + , a[n-1] + a[n-2]0, 1
a[n] = $($inits:expr),+ , ... , $recur:expr + a[n-1] + a[n-2]0, 1
a[n] = $($inits:expr),+ , ... , $recur:expr + 0, 1a[n-1] + a[n-2]
+ 注意:这一步表明,类似 $recur:expr + 的绑定将消耗一个完整的表达式。 + 究竟什么算是一个完整的表达式,将由编译器决定。 + 稍后我们会谈到语言其它部分的类似行为。 +
+

从此表中得到的最关键收获在于,宏系统会依次“尝试”将提供给它的每个标记当作输入, +然后与提供给它的每条规则进行匹配。我们稍后还将谈回到这一“尝试”。

+

接下来我们开始写 宏调用完全展开后的形态。 +我们想要的结构类似:

+
let fib = {
+    struct Recurrence {
+        mem: [u64; 2],
+        pos: usize,
+    }
+

这就是我们实际使用的迭代器类型。 +其中, mem 负责存储最后计算得到的两个斐波那契值, +以保证递推计算能够顺利进行; pos 则负责记录当前的 n 的值。

+
+

附注:此处选用 u64 是因为,对斐波那契数列来说,它已经“足够”了。 +先不必担心它是否适用于其它数列,我们会提到这一点的。

+
+
    impl Iterator for Recurrence {
+        type Item = u64;
+
+        #[inline]
+        fn next(&mut self) -> Option<Self::Item> {
+            if self.pos < 2 {
+                let next_val = self.mem[self.pos];
+                self.pos += 1;
+                Some(next_val)
+

我们需要这个 if 分支来返回序列的初始值,没什么技巧。

+
            } else {
+                let a = /* something */;
+                let n = self.pos;
+                let next_val = a[n-1] + a[n-2];
+
+                self.mem.TODO_shuffle_down_and_append(next_val);
+
+                self.pos += 1;
+                Some(next_val)
+            }
+        }
+    }
+

这段稍微难办一点。 +对于具体如何定义 a ,我们稍后再提。 +TODO_shuffle_down_and_append 的真面目也将留到稍后揭晓; +我们想让它做到:将 next_val 放至数组末尾, +并将数组中剩下的元素依次前移一格,最后丢掉原先的首元素。

+

+    Recurrence { mem: [0, 1], pos: 0 }
+};
+
+for e in fib.take(10) { println!("{}", e) }
+

最后,我们返回一个该结构的实例。 +在随后的代码中,我们将用它来进行迭代。 +综上所述,完整的展开应该如下:

+
let fib = {
+    struct Recurrence {
+        mem: [u64; 2],
+        pos: usize,
+    }
+
+    impl Iterator for Recurrence {
+        type Item = u64;
+
+        #[inline]
+        fn next(&mut self) -> Option<u64> {
+            if self.pos < 2 {
+                let next_val = self.mem[self.pos];
+                self.pos += 1;
+                Some(next_val)
+            } else {
+                let a = /* something */;
+                let n = self.pos;
+                let next_val = (a[n-1] + a[n-2]);
+
+                self.mem.TODO_shuffle_down_and_append(next_val.clone());
+
+                self.pos += 1;
+                Some(next_val)
+            }
+        }
+    }
+
+    Recurrence { mem: [0, 1], pos: 0 }
+};
+
+for e in fib.take(10) { println!("{}", e) }
+
+

附注:的确,这样做的确意味着每次调用该宏时,我们都会重新定义并实现一个 Recurrence 结构。 +如果 #[inline] 属性应用得当,在最终编译出的二进制文件中,大部分冗余都将被优化掉。

+
+

在写展开部分的过程中时常检查,也是一个有效的技巧。 +如果在过程中发现,展开中的某些内容需要根据调用的不同发生改变, +但这些内容并未被我们的宏语法定义囊括; +那就要去考虑,应该怎样去引入它们。 +在此示例中,我们先前用过一次 u64 ,但调用者想要的类型不一定是它; +然而我们的宏语法并没有提供其它选择。因此,我们可以做一些修改。

+
macro_rules! recurrence {
+    ( a[n]: $sty:ty = $($inits:expr),+ , ... , $recur:expr ) => { /* ... */ };
+}
+
+/*
+let fib = recurrence![a[n]: u64 = 0, 1, ..., a[n-1] + a[n-2]];
+
+for e in fib.take(10) { println!("{}", e) }
+*/
+fn main() {}
+

我们加入了一个新的 元变量 sty,它应捕获一个类型 (type) 。

+
+

附注:如果你不清楚在捕获冒号之后的部分,那可是几种语法匹配候选项之一。 +最常用的包括 itemexprty。 +完整的解释参考 元变量

+

还要注意一点:为方便语言的未来发展,对于跟在某些特定的匹配之后的标记,编译器施加了一些限制。 +这种情况常在试图匹配至表达式 (expression) 或语句 (statement) 时出现: +它们后面仅允许跟进 =>,; 这些标记之一。 +完整清单可在 +片段分类符的跟随限制 找到。

+
+

索引与移位

+

在此节中我们将略去一些实际上与宏的联系不太紧密的内容。 +这节的目标是,让用户可以通过索引 a 来访问数列中先前的值。 +a 应该如同一个滑动窗口 (sliding window), +让我们得以持续访问数列中最近几个(在本例中,两个)值。

+

通过采用封装类型,我们可以轻易地做到这点:

+
struct IndexOffset<'a> {
+    slice: &'a [u64; 2],
+    offset: usize,
+}
+
+impl<'a> Index<usize> for IndexOffset<'a> {
+    type Output = u64;
+
+    #[inline(always)]
+    fn index<'b>(&'b self, index: usize) -> &'b u64 {
+        use std::num::Wrapping;
+
+        let index = Wrapping(index);
+        let offset = Wrapping(self.offset);
+        let window = Wrapping(2);
+
+        let real_index = index - offset + window;
+        &self.slice[real_index.0]
+    }
+}
+
+

附注:对于新接触 Rust 的人来说,生命周期的概念经常需要一番思考。 +我们给出一些简单的解释:'a'b 是生命周期注解, +它们被用于追踪引用一直有效(引用:即一个指向某些数据的借用指针)。 +在此例中, IndexOffset 借用了一个指向迭代器数据的引用, +因此,它需要记录该引用能被保持有效的时长,记录的内容正是 'a

+

我们用到 'b,是因为 Index::index 函数(下标句法正是通过此函数实现的) +的一个参数也需要生命周期。 'a'b 不一定在所有情况下都相同。 +我们并没有显式地声明 'a'b 之间有任何联系,但借用检查器 (borrow checker) +总会确保内存安全性不被意外破坏。

+
+

a 的定义将随之变为:

+
let a = IndexOffset { slice: &self.mem, offset: n };
+

如何处理 TODO_shuffle_down_and_append 是我们现在剩下的唯一问题了。 +我没能在标准库中寻得可以直接使用的方法,但自己造一个出来并不难。

+
{
+    use std::mem::swap;
+
+    let mut swap_tmp = next_val;
+    for i in (0..2).rev() {
+        swap(&mut swap_tmp, &mut self.mem[i]);
+    }
+}
+

它把新值替换至数组末尾,并把其他值向前移动一位。

+
+

附注:采用这种做法,将使得我们的代码可同时被用于不可拷贝 (non-copyable) 的类型。

+
+

至此,最终起作用的代码将是(可直接在代码块编辑,或者点击右上的运行按钮看看):

+
macro_rules! recurrence {
+    ( a[n]: $sty:ty = $($inits:expr),+ , ... , $recur:expr ) => { /* ... */ };
+}
+
+fn main() {
+    /*
+    let fib = recurrence![a[n]: u64 = 0, 1, ..., a[n-1] + a[n-2]];
+
+    for e in fib.take(10) { println!("{}", e) }
+    */
+    let fib = {
+        use std::ops::Index;
+
+        struct Recurrence {
+            mem: [u64; 2],
+            pos: usize,
+        }
+
+        struct IndexOffset<'a> {
+            slice: &'a [u64; 2],
+            offset: usize,
+        }
+
+        impl<'a> Index<usize> for IndexOffset<'a> {
+            type Output = u64;
+
+            #[inline(always)]
+            fn index<'b>(&'b self, index: usize) -> &'b u64 {
+                use std::num::Wrapping;
+
+                let index = Wrapping(index);
+                let offset = Wrapping(self.offset);
+                let window = Wrapping(2);
+
+                let real_index = index - offset + window;
+                &self.slice[real_index.0]
+            }
+        }
+
+        impl Iterator for Recurrence {
+            type Item = u64;
+
+            #[inline]
+            fn next(&mut self) -> Option<u64> {
+                if self.pos < 2 {
+                    let next_val = self.mem[self.pos];
+                    self.pos += 1;
+                    Some(next_val)
+                } else {
+                    let next_val = {
+                        let n = self.pos;
+                        let a = IndexOffset { slice: &self.mem, offset: n };
+                        (a[n-1] + a[n-2])
+                    };
+
+                    {
+                        use std::mem::swap;
+
+                        let mut swap_tmp = next_val;
+                        for i in (0..2).rev() {
+                            swap(&mut swap_tmp, &mut self.mem[i]);
+                        }
+                    }
+
+                    self.pos += 1;
+                    Some(next_val)
+                }
+            }
+        }
+
+        Recurrence { mem: [0, 1], pos: 0 }
+    };
+
+    for e in fib.take(10) { println!("{}", e) }
+}
+

注意我们改变了 na 的声明顺序, +同时将它们(与递推表达式一起)用一个新区块包裹了起来。 +改变声明顺序的理由很明显,因为 n 得在 a 前被定义才能被 a 使用。 +而包裹的理由则是:如果不这么做,借用引用 &self.mem 会阻止随后的 swap 操作 +(在某物仍存在其它别名时,无法对其进行改变)。 +包裹区块将确保 &self.mem 产生的借用在彼时失效。

+

顺带一提,将交换 mem 的代码包进区块里的唯一原因, +是为了缩减 std::mem::swap 的可用范畴,以保持代码整洁。

+

如果我们直接拿这段代码来跑,会顺利得到结果:

+
0
+1
+1
+2
+3
+5
+8
+13
+21
+34
+
+

现在,让我们把这段代码复制粘贴进宏的展开部分, +并把它们原本所在的位置换成一次宏调用。这样我们得到:

+
macro_rules! recurrence {
+    ( a[n]: $sty:ty = $($inits:expr),+ , ... , $recur:expr ) => {
+        {
+            /*
+                What follows here is *literally* the code from before,
+                cut and pasted into a new position. No other changes
+                have been made.
+            */
+
+            use std::ops::Index;
+
+            struct Recurrence {
+                mem: [u64; 2],
+                pos: usize,
+            }
+
+            struct IndexOffset<'a> {
+                slice: &'a [u64; 2],
+                offset: usize,
+            }
+
+            impl<'a> Index<usize> for IndexOffset<'a> {
+                type Output = u64;
+
+                #[inline(always)]
+                fn index<'b>(&'b self, index: usize) -> &'b u64 {
+                    use std::num::Wrapping;
+
+                    let index = Wrapping(index);
+                    let offset = Wrapping(self.offset);
+                    let window = Wrapping(2);
+
+                    let real_index = index - offset + window;
+                    &self.slice[real_index.0]
+                }
+            }
+
+            impl Iterator for Recurrence {
+                type Item = u64;
+
+                #[inline]
+                fn next(&mut self) -> Option<u64> {
+                    if self.pos < 2 {
+                        let next_val = self.mem[self.pos];
+                        self.pos += 1;
+                        Some(next_val)
+                    } else {
+                        let next_val = {
+                            let n = self.pos;
+                            let a = IndexOffset { slice: &self.mem, offset: n };
+                            (a[n-1] + a[n-2])
+                        };
+
+                        {
+                            use std::mem::swap;
+
+                            let mut swap_tmp = next_val;
+                            for i in (0..2).rev() {
+                                swap(&mut swap_tmp, &mut self.mem[i]);
+                            }
+                        }
+
+                        self.pos += 1;
+                        Some(next_val)
+                    }
+                }
+            }
+
+            Recurrence { mem: [0, 1], pos: 0 }
+        }
+    };
+}
+
+fn main() {
+    let fib = recurrence![a[n]: u64 = 0, 1, ..., a[n-1] + a[n-2]];
+
+    for e in fib.take(10) { println!("{}", e) }
+}
+

显然,宏的捕获尚未被用到,但这点很容易修改。 +不过,如果尝试编译上述代码,rustc 会中止,并显示:

+
error: local ambiguity: multiple parsing options: built-in NTs expr ('inits') or 1 other option.
+  --> src/main.rs:75:45
+   |
+75 |     let fib = recurrence![a[n]: u64 = 0, 1, ..., a[n-1] + a[n-2]];
+   |              
+
+

这里我们撞上了 macro_rules! 的一处的跟随限制。 +问题出在那第二个逗号上。 +当在展开过程中遇见它时,编译器无法决定是该将它解析成 inits 中的又一个表达式, +还是解析成 ... 。很遗憾,它不够聪明,没办法意识到 ... 不是一个有效的表达式,所以它选择了放弃。 +理论上 来说,上述代码应该能奏效,但当前它并不能。

+
+

附注:有关宏系统如何解读我们的规则,我之前的确撒了点小谎(指没有从“正确”的规则开始)。 +通常来说,宏系统确实应当如我前述的那般运作,但在这里它没有。 +macro_rules! 的机制,由此看来,是存在一些小毛病的; +我们不得不记得偶尔去做一些微调,好让它我们期许的那般运作。

+

在本例中,问题有两个。

+
    +
  1. 宏系统不清楚各式各样的语法元素(如表达式)可由什么样的东西构成, +或不能由什么样的东西构成;那是语法解析器的工作。
  2. +
  3. 在试图捕获复合语法元素(如表达式)的过程中,它如果不是 100% 地确定 +应该进行捕获的话,那么无法实行捕获。
  4. +
+

换句话说,宏系统可以向语法解析器发出请求,让解析器试图把某段输入当作表达式来进行解析; +但此间无论语法解析器遇见任何问题,都将中止整个进程以示回应。 +目前,宏系统处理这种窘境的唯一方式,就是对任何可能产生此类问题的情境加以禁止。

+

好的一面在于,对于这摊子情况,没有任何人乐于看到。 +所以关键词 macro 早已被预留,以备未来更加严密的宏系统使用。 +只是直到那天来临之前,我们还是该怎么做就怎么做,乖乖遵循跟随限制 :)

+
+

还好,修正方案也很简单:从宏句法中去掉逗号即可。 +出于平衡考量,我们将移除 ... 双边的逗号:

+
macro_rules! recurrence {
+    ( a[n]: $sty:ty = $($inits:expr),+ ... $recur:expr ) => {  };
+}
+

可惜作者在这里给的方案早在 1.14 版不再编译通过(由原版翻译者所言), +而且至今(1.54 版,笔者所试)这里也无法使用 ... 编译, +因为 expr 之后只能跟随 =>,; 之一 +以下续作者修改为编译通过的版本。

+

我们现在运气不好,因为我们想象出来的语法不会以这种方式工作, +所以让我们只选择一个看起来最适合的。 +关键点在于分隔符不被识别,而通常使用 , 或者 ; 作为分隔符, +所以可以把原来的 , ... ,替换成 ; 或者 ; ... ;

+
macro_rules! recurrence {
+    ( a[n]: $sty:ty = $($inits:expr),+ ; ... ; $recur:expr ) => {
+//                                     ^~~~~~^ changed
+        /* ... */
+        // Cheat :D
+        (vec![0u64, 1, 2, 3, 5, 8, 13, 21, 34]).into_iter()
+    };
+}
+
+fn main() {
+    let fib = recurrence![a[n]: u64 = 0, 1; ...; a[n-1] + a[n-2]];
+//                                        ^~~~~^ changed
+
+    for e in fib.take(10) { println!("{}", e) }
+}
+

成功!现在,我们该将捕获部分捕获到的内容替代进展开部分中了。

+

替换

+

在宏中替换你捕获到的内容非常简单, +通过 $sty:ty 捕获到的内容可用 $sty 来替换。 +好,让我们换掉那些 u64 吧:

+
macro_rules! recurrence {
+    ( a[n]: $sty:ty = $($inits:expr),+ ; ... ; $recur:expr ) => {
+        {
+            use std::ops::Index;
+
+            struct Recurrence {
+                mem: [$sty; 2],
+//                    ^~~~ changed
+                pos: usize,
+            }
+
+            struct IndexOffset<'a> {
+                slice: &'a [$sty; 2],
+//                          ^~~~ changed
+                offset: usize,
+            }
+
+            impl<'a> Index<usize> for IndexOffset<'a> {
+                type Output = $sty;
+//                            ^~~~ changed
+
+                #[inline(always)]
+                fn index<'b>(&'b self, index: usize) -> &'b $sty {
+//                                                          ^~~~ changed
+                    use std::num::Wrapping;
+
+                    let index = Wrapping(index);
+                    let offset = Wrapping(self.offset);
+                    let window = Wrapping(2);
+
+                    let real_index = index - offset + window;
+                    &self.slice[real_index.0]
+                }
+            }
+
+            impl Iterator for Recurrence {
+                type Item = $sty;
+//                          ^~~~ changed
+
+                #[inline]
+                fn next(&mut self) -> Option<$sty> {
+//                                           ^~~~ changed
+                    /* ... */
+                    if self.pos < 2 {
+                        let next_val = self.mem[self.pos];
+                        self.pos += 1;
+                        Some(next_val)
+                    } else {
+                        let next_val = {
+                            let n = self.pos;
+                            let a = IndexOffset { slice: &self.mem, offset: n };
+                            (a[n-1] + a[n-2])
+                        };
+    
+                        {
+                            use std::mem::swap;
+    
+                            let mut swap_tmp = next_val;
+                            for i in (0..2).rev() {
+                                swap(&mut swap_tmp, &mut self.mem[i]);
+                            }
+                        }
+    
+                        self.pos += 1;
+                        Some(next_val)
+                    }
+                }
+            }
+
+            Recurrence { mem: [0, 1], pos: 0 }
+        }
+    };
+}
+
+fn main() {
+    let fib = recurrence![a[n]: u64 = 0, 1; ...; a[n-1] + a[n-2]];
+
+    for e in fib.take(10) { println!("{}", e) }
+}
+

现在让我们来尝试更难的:如何将 inits 同时转变为字面值 [0, 1] +以及数组类型 [$sty; 2] 。首先我们试试:

+
            Recurrence { mem: [$($inits),+], pos: 0 }
+//                             ^~~~~~~~~~~ changed
+

此段代码与捕获的效果正好相反:将 inits 捕得的内容排列开来,总共有 1 或多次, +每条内容之间用逗号分隔。展开的结果与期望一致,我们得到标记序列:0, 1

+

不过,通过 inits 转换出字面值 2 需要一些技巧。 +没有直接可行的方法,但我们可以通过另一个宏做到。我们一步一步来。

+
macro_rules! count_exprs {
+    /* ??? */
+    () => {}
+}
+fn main() {}
+

先写显而易见的情况:未给表达式时,我们期望count_exprs展开为字面值0

+
macro_rules! count_exprs {
+    () => (0);
+//  ^~~~~~~~~~ added
+}
+fn main() {
+    const _0: usize = count_exprs!();
+    assert_eq!(_0, 0);
+}
+
+

附注:你可能已经注意到了,这里的展开部分我用的是括号而非花括号。 +macro_rules! 其实不关心你用的是什么,只要它成对匹配即可:( ){ }[ ]。 +实际上,宏本身的匹配符(即紧跟宏名称后的匹配符)、 +语法规则外的匹配符及相应展开部分外的匹配符都可以替换。

+

调用宏时的括号也可被替换,但有些限制:当宏被以 {...}(...); 形式调用时, +它总是会被解析为一个条目(item,比如 structfn 声明)。 +在函数体内部时,这一特征很重要,它将消除“解析成表达式”和“解析成语句”之间的歧义。

+
+

有一个表达式的情况该怎么办?应该展开为字面值 1

+
macro_rules! count_exprs {
+    () => (0);
+    ($e:expr) => (1);
+//  ^~~~~~~~~~~~~~~~~ added
+}
+fn main() {
+    const _0: usize = count_exprs!();
+    const _1: usize = count_exprs!(x);
+    assert_eq!(_0, 0);
+    assert_eq!(_1, 1);
+}
+

两个呢?

+
macro_rules! count_exprs {
+    () => (0);
+    ($e:expr) => (1);
+    ($e0:expr, $e1:expr) => (2);
+//  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ added
+}
+fn main() {
+    const _0: usize = count_exprs!();
+    const _1: usize = count_exprs!(x);
+    const _2: usize = count_exprs!(x, y);
+    assert_eq!(_0, 0);
+    assert_eq!(_1, 1);
+    assert_eq!(_2, 2);
+}
+

通过递归调用重新表达,我们可将扩展部分“精简”出来:

+
macro_rules! count_exprs {
+    () => (0);
+    ($e:expr) => (1);
+    ($e0:expr, $e1:expr) => (1 + count_exprs!($e1));
+//                           ^~~~~~~~~~~~~~~~~~~~~ changed
+}
+fn main() {
+    const _0: usize = count_exprs!();
+    const _1: usize = count_exprs!(x);
+    const _2: usize = count_exprs!(x, y);
+    assert_eq!(_0, 0);
+    assert_eq!(_1, 1);
+    assert_eq!(_2, 2);
+}
+

这样做可行是因为,Rust可将 1 + 1 合并成一个常量。 +那么,三种表达式的情况呢?

+
macro_rules! count_exprs {
+    () => (0);
+    ($e:expr) => (1);
+    ($e0:expr, $e1:expr) => (1 + count_exprs!($e1));
+    ($e0:expr, $e1:expr, $e2:expr) => (1 + count_exprs!($e1, $e2));
+//  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ added
+}
+fn main() {
+    const _0: usize = count_exprs!();
+    const _1: usize = count_exprs!(x);
+    const _2: usize = count_exprs!(x, y);
+    const _3: usize = count_exprs!(x, y, z);
+    assert_eq!(_0, 0);
+    assert_eq!(_1, 1);
+    assert_eq!(_2, 2);
+    assert_eq!(_3, 3);
+}
+
+

附注:你可能会想,我们是否能翻转这些规则的排列顺序。 +在此情境下,可以。但在有些情况下,宏系统可能会对此挑剔。 +如果你发现自己有一个包含多项规则的宏系统老是报错,或给出期望外的结果; +但你发誓它应该能用,试着调换一下规则的排序吧。

+
+

我们希望你现在已经能看出规律。 +通过匹配至一个表达式加上 0 或多个表达式并展开成 1+a,我们可以减少规则列表的数目:

+
macro_rules! count_exprs {
+    () => (0);
+    ($head:expr) => (1);
+    ($head:expr, $($tail:expr),*) => (1 + count_exprs!($($tail),*));
+//  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ changed
+}
+fn main() {
+    const _0: usize = count_exprs!();
+    const _1: usize = count_exprs!(x);
+    const _2: usize = count_exprs!(x, y);
+    const _3: usize = count_exprs!(x, y, z);
+    assert_eq!(_0, 0);
+    assert_eq!(_1, 1);
+    assert_eq!(_2, 2);
+    assert_eq!(_3, 3);
+}
+
+

仅对此例: +这段代码并非计数仅有或其最好的方法。 +若有兴趣,稍后可以研读 计数 一节。

+
+

有此工具后,我们可再次修改 recurrence ,确定 mem 所需的大小。

+
// added:
+macro_rules! count_exprs {
+    () => (0);
+    ($head:expr) => (1);
+    ($head:expr, $($tail:expr),*) => (1 + count_exprs!($($tail),*));
+}
+
+macro_rules! recurrence {
+    ( a[n]: $sty:ty = $($inits:expr),+ ; ... ; $recur:expr ) => {
+        {
+            use std::ops::Index;
+
+            const MEM_SIZE: usize = count_exprs!($($inits),+);
+//          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ added
+
+            struct Recurrence {
+                mem: [$sty; MEM_SIZE],
+//                          ^~~~~~~~ changed
+                pos: usize,
+            }
+
+            struct IndexOffset<'a> {
+                slice: &'a [$sty; MEM_SIZE],
+//                                ^~~~~~~~ changed
+                offset: usize,
+            }
+
+            impl<'a> Index<usize> for IndexOffset<'a> {
+                type Output = $sty;
+
+                #[inline(always)]
+                fn index<'b>(&'b self, index: usize) -> &'b $sty {
+                    use std::num::Wrapping;
+
+                    let index = Wrapping(index);
+                    let offset = Wrapping(self.offset);
+                    let window = Wrapping(MEM_SIZE);
+//                                        ^~~~~~~~ changed
+
+                    let real_index = index - offset + window;
+                    &self.slice[real_index.0]
+                }
+            }
+
+            impl Iterator for Recurrence {
+                type Item = $sty;
+
+                #[inline]
+                fn next(&mut self) -> Option<$sty> {
+                    if self.pos < MEM_SIZE {
+//                                ^~~~~~~~ changed
+                        let next_val = self.mem[self.pos];
+                        self.pos += 1;
+                        Some(next_val)
+                    } else {
+                        let next_val = {
+                            let n = self.pos;
+                            let a = IndexOffset { slice: &self.mem, offset: n };
+                            (a[n-1] + a[n-2])
+                        };
+
+                        {
+                            use std::mem::swap;
+
+                            let mut swap_tmp = next_val;
+                            for i in (0..MEM_SIZE).rev() {
+//                                       ^~~~~~~~ changed
+                                swap(&mut swap_tmp, &mut self.mem[i]);
+                            }
+                        }
+
+                        self.pos += 1;
+                        Some(next_val)
+                    }
+                }
+            }
+
+            Recurrence { mem: [$($inits),+], pos: 0 }
+        }
+    };
+}
+/* ... */
+
+fn main() {
+    let fib = recurrence![a[n]: u64 = 0, 1; ...; a[n-1] + a[n-2]];
+
+    for e in fib.take(10) { println!("{}", e) }
+}
+

完成之后,我们开始替换最后的 recur 表达式。

+
macro_rules! count_exprs {
+    () => (0);
+    ($head:expr $(, $tail:expr)*) => (1 + count_exprs!($($tail),*));
+}
+macro_rules! recurrence {
+    ( a[n]: $sty:ty = $($inits:expr),+ ; ... ; $recur:expr ) => {
+        {
+            use std::ops::Index;
+
+            const MEM_SIZE: usize = count_exprs!($($inits),+);
+            struct Recurrence {
+                mem: [$sty; MEM_SIZE],
+                pos: usize,
+            }
+            struct IndexOffset<'a> {
+                slice: &'a [$sty; MEM_SIZE],
+                offset: usize,
+            }
+            impl<'a> Index<usize> for IndexOffset<'a> {
+                type Output = $sty;
+
+                #[inline(always)]
+                fn index<'b>(&'b self, index: usize) -> &'b $sty {
+                    use std::num::Wrapping;
+
+                    let index = Wrapping(index);
+                    let offset = Wrapping(self.offset);
+                    let window = Wrapping(MEM_SIZE);
+
+                    let real_index = index - offset + window;
+                    &self.slice[real_index.0]
+                }
+            }
+            impl Iterator for Recurrence {
+              type Item = $sty;
+/* ... */
+                #[inline]
+                fn next(&mut self) -> Option<u64> {
+                    if self.pos < MEM_SIZE {
+                        let next_val = self.mem[self.pos];
+                        self.pos += 1;
+                        Some(next_val)
+                    } else {
+                        let next_val = {
+                            let n = self.pos;
+                            let a = IndexOffset { slice: &self.mem, offset: n };
+                            $recur
+//                          ^~~~~~ changed
+                        };
+                        {
+                            use std::mem::swap;
+                            let mut swap_tmp = next_val;
+                            for i in (0..MEM_SIZE).rev() {
+                                swap(&mut swap_tmp, &mut self.mem[i]);
+                            }
+                        }
+                        self.pos += 1;
+                        Some(next_val)
+                    }
+                }
+/* ... */
+            }
+            Recurrence { mem: [$($inits),+], pos: 0 }
+        }
+    };
+}
+fn main() {
+    let fib = recurrence![a[n]: u64 = 1, 1; ...; a[n-1] + a[n-2]];
+    for e in fib.take(10) { println!("{}", e) }
+}
+

现在试图编译的话...

+
error[E0425]: cannot find value `a` in this scope
+  --> src/main.rs:68:50
+   |
+68 |     let fib = recurrence![a[n]: u64 = 1, 1; ...; a[n-1] + a[n-2]];
+   |                                                  ^ not found in this scope
+
+error[E0425]: cannot find value `n` in this scope
+  --> src/main.rs:68:52
+   |
+68 |     let fib = recurrence![a[n]: u64 = 1, 1; ...; a[n-1] + a[n-2]];
+   |                                                    ^ not found in this scope
+
+error[E0425]: cannot find value `a` in this scope
+  --> src/main.rs:68:59
+   |
+68 |     let fib = recurrence![a[n]: u64 = 1, 1; ...; a[n-1] + a[n-2]];
+   |                                                           ^ not found in this scope
+
+error[E0425]: cannot find value `n` in this scope
+  --> src/main.rs:68:61
+   |
+68 |     let fib = recurrence![a[n]: u64 = 1, 1; ...; a[n-1] + a[n-2]];
+   |                                                             ^ not found in this scope
+
+

...等等,什么情况?这没道理...让我们看看宏究竟展开成了什么样子。

+
$ rustc -Z unstable-options --pretty expanded recurrence.rs
+
+

参数 --pretty expanded 将促使 rustc 展开宏,并将输出的 AST 再重转为源代码。 +此选项当前被认定为是 unstable ,因此我们还要添加 -Z unstable-options 。 +输出的信息(经过整理格式后)如下;特别留意 $recur 被替换掉的位置:

+
#![feature(no_std)]
+#![no_std]
+#[prelude_import]
+use std::prelude::v1::*;
+#[macro_use]
+extern crate std as std;
+fn main() {
+    let fib = {
+        use std::ops::Index;
+        const MEM_SIZE: usize = 1 + 1;
+        struct Recurrence {
+            mem: [u64; MEM_SIZE],
+            pos: usize,
+        }
+        struct IndexOffset<'a> {
+            slice: &'a [u64; MEM_SIZE],
+            offset: usize,
+        }
+        impl <'a> Index<usize> for IndexOffset<'a> {
+            type Output = u64;
+            #[inline(always)]
+            fn index<'b>(&'b self, index: usize) -> &'b u64 {
+                use std::num::Wrapping;
+                let index = Wrapping(index);
+                let offset = Wrapping(self.offset);
+                let window = Wrapping(MEM_SIZE);
+                let real_index = index - offset + window;
+                &self.slice[real_index.0]
+            }
+        }
+        impl Iterator for Recurrence {
+            type Item = u64;
+            #[inline]
+            fn next(&mut self) -> Option<u64> {
+                if self.pos < MEM_SIZE {
+                    let next_val = self.mem[self.pos];
+                    self.pos += 1;
+                    Some(next_val)
+                } else {
+                    let next_val = {
+                        let n = self.pos;
+                        let a = IndexOffset{slice: &self.mem, offset: n,};
+                        a[n - 1] + a[n - 2]
+                    };
+                    {
+                        use std::mem::swap;
+                        let mut swap_tmp = next_val;
+                        {
+                            let result =
+                                match ::std::iter::IntoIterator::into_iter((0..MEM_SIZE).rev()) {
+                                    mut iter => loop {
+                                        match ::std::iter::Iterator::next(&mut iter) {
+                                            ::std::option::Option::Some(i) => {
+                                                swap(&mut swap_tmp, &mut self.mem[i]);
+                                            }
+                                            ::std::option::Option::None => break,
+                                        }
+                                    },
+                                };
+                            result
+                        }
+                    }
+                    self.pos += 1;
+                    Some(next_val)
+                }
+            }
+        }
+        Recurrence{mem: [0, 1], pos: 0,}
+    };
+    {
+        let result =
+            match ::std::iter::IntoIterator::into_iter(fib.take(10)) {
+                mut iter => loop {
+                    match ::std::iter::Iterator::next(&mut iter) {
+                        ::std::option::Option::Some(e) => {
+                            ::std::io::_print(::std::fmt::Arguments::new_v1(
+                                {
+                                    static __STATIC_FMTSTR: &'static [&'static str] = &["", "\n"];
+                                    __STATIC_FMTSTR
+                                },
+                                &match (&e,) {
+                                    (__arg0,) => [::std::fmt::ArgumentV1::new(__arg0, ::std::fmt::Display::fmt)],
+                                }
+                            ))
+                        }
+                        ::std::option::Option::None => break,
+                    }
+                },
+            };
+        result
+    }
+}
+

呃..这看起来完全合法! +如果我们加上几条 #![feature(...)] 属性,并把它送去给一个 nightly 版本的 rustc, +甚至真能通过编译...究竟什么情况?!

+
+

附注:上述代码无法通过非 nightly 版 rustc 编译。 +这是因为, println! 宏的展开结果依赖于编译器内部的细节,这些细节尚未被公开稳定化。

+
+

保持卫生性

+

这儿的问题在于,Rust 宏中的标识符具有卫生性。 +这就是说,出自不同上下文的标识符不可能发生冲突。 +作为演示,举个简单的例子。

+
macro_rules! using_a {
+    ($e:expr) => {
+        {
+            let a = 42i;
+            $e
+        }
+    }
+}
+
+let four = using_a!(a / 10);
+fn main() {}
+

此宏接受一个表达式,然后把它包进一个定义了变量 a 的代码块里。 +我们随后用它绕个弯子来求 4 。 +这个例子中实际上存在 2 种句法上下文,但我们看不见它们。 +为了帮助说明,我们给每个上下文都上一种不同的颜色。 +我们从未展开的代码开始上色,此时仅看得见一种上下文:

+
macro_rules! using_a {
    ($e:expr) => {
        {
            let a = 42;
            $e
        }
    }
}

let four = using_a!(a / 10);
+

现在,展开宏调用。

+
let four = {
    let a = 42;
    a / 10
};
+

可以看到,在宏中定义的a +与调用所提供的a处于不同的上下文中。 +因此,虽然它们的字母表示一致,编译器仍将它们视作完全不同的标识符。

+

宏的这一特性需要格外留意:它们可能会产出无法通过编译的 AST; +但同样的代码,手写或通过 --pretty expanded 转印出来则能够通过编译。

+

解决方案是,采用合适的句法上下文来捕获标识符。我们沿用上例,并作修改:

+
macro_rules! using_a {
    ($a:ident, $e:expr) => {
        {
            let $a = 42;
            $e
        }
    }
}

let four = using_a!(a, a / 10);
+

现在它将展开为:

+
let four = {
    let a = 42;
    a / 10
};
+

上下文现在匹配了,编译通过。 +我们的 recurrence! 宏也可被如此调整: +显式地捕获an即可。调整后我们得到:

+
macro_rules! count_exprs {
+    () => (0);
+    ($head:expr) => (1);
+    ($head:expr, $($tail:expr),*) => (1 + count_exprs!($($tail),*));
+}
+
+macro_rules! recurrence {
+    ( $seq:ident [ $ind:ident ]: $sty:ty = $($inits:expr),+ ; ... ; $recur:expr ) => {
+//    ^~~~~~~~~~   ^~~~~~~~~~ changed
+        {
+            use std::ops::Index;
+
+            const MEM_SIZE: usize = count_exprs!($($inits),+);
+
+            struct Recurrence {
+                mem: [$sty; MEM_SIZE],
+                pos: usize,
+            }
+
+            struct IndexOffset<'a> {
+                slice: &'a [$sty; MEM_SIZE],
+                offset: usize,
+            }
+
+            impl<'a> Index<usize> for IndexOffset<'a> {
+                type Output = $sty;
+
+                #[inline(always)]
+                fn index<'b>(&'b self, index: usize) -> &'b $sty {
+                    use std::num::Wrapping;
+
+                    let index = Wrapping(index);
+                    let offset = Wrapping(self.offset);
+                    let window = Wrapping(MEM_SIZE);
+
+                    let real_index = index - offset + window;
+                    &self.slice[real_index.0]
+                }
+            }
+
+            impl Iterator for Recurrence {
+                type Item = $sty;
+
+                #[inline]
+                fn next(&mut self) -> Option<$sty> {
+                    if self.pos < MEM_SIZE {
+                        let next_val = self.mem[self.pos];
+                        self.pos += 1;
+                        Some(next_val)
+                    } else {
+                        let next_val = {
+                            let $ind = self.pos;
+//                              ^~~~ changed
+                            let $seq = IndexOffset { slice: &self.mem, offset: $ind };
+//                              ^~~~ changed
+                            $recur
+                        };
+
+                        {
+                            use std::mem::swap;
+
+                            let mut swap_tmp = next_val;
+                            for i in (0..MEM_SIZE).rev() {
+                                swap(&mut swap_tmp, &mut self.mem[i]);
+                            }
+                        }
+
+                        self.pos += 1;
+                        Some(next_val)
+                    }
+                }
+            }
+
+            Recurrence { mem: [$($inits),+], pos: 0 }
+        }
+    };
+}
+
+fn main() {
+    let fib = recurrence![a[n]: u64 = 0, 1; ...; a[n-1] + a[n-2]];
+
+    for e in fib.take(10) { println!("{}", e) }
+}
+

通过编译了!接下来,我们试试别的数列。

+
macro_rules! count_exprs {
+    () => (0);
+    ($head:expr) => (1);
+    ($head:expr, $($tail:expr),*) => (1 + count_exprs!($($tail),*));
+}
+
+macro_rules! recurrence {
+    ( $seq:ident [ $ind:ident ]: $sty:ty = $($inits:expr),+ ; ... ; $recur:expr ) => {
+        {
+            use std::ops::Index;
+            
+            const MEM_SIZE: usize = count_exprs!($($inits),+);
+    
+            struct Recurrence {
+                mem: [$sty; MEM_SIZE],
+                pos: usize,
+            }
+    
+            struct IndexOffset<'a> {
+                slice: &'a [$sty; MEM_SIZE],
+                offset: usize,
+            }
+    
+            impl<'a> Index<usize> for IndexOffset<'a> {
+                type Output = $sty;
+    
+                #[inline(always)]
+                fn index<'b>(&'b self, index: usize) -> &'b $sty {
+                    use std::num::Wrapping;
+                    
+                    let index = Wrapping(index);
+                    let offset = Wrapping(self.offset);
+                    let window = Wrapping(MEM_SIZE);
+                    
+                    let real_index = index - offset + window;
+                    &self.slice[real_index.0]
+                }
+            }
+    
+            impl Iterator for Recurrence {
+                type Item = $sty;
+    
+                #[inline]
+                fn next(&mut self) -> Option<$sty> {
+                    if self.pos < MEM_SIZE {
+                        let next_val = self.mem[self.pos];
+                        self.pos += 1;
+                        Some(next_val)
+                    } else {
+                        let next_val = {
+                            let $ind = self.pos;
+                            let $seq = IndexOffset { slice: &self.mem, offset: $ind };
+                            $recur
+                        };
+    
+                        {
+                            use std::mem::swap;
+    
+                            let mut swap_tmp = next_val;
+                            for i in (0..MEM_SIZE).rev() {
+                                swap(&mut swap_tmp, &mut self.mem[i]);
+                            }
+                        }
+    
+                        self.pos += 1;
+                        Some(next_val)
+                    }
+                }
+            }
+    
+            Recurrence { mem: [$($inits),+], pos: 0 }
+        }
+    };
+}
+
+fn main() {
+for e in recurrence!(f[i]: f64 = 1.0; ...; f[i-1] * i as f64).take(10) {
+    println!("{}", e)
+}
+}
+

运行上述代码得到:

+
1
+1
+2
+6
+24
+120
+720
+5040
+40320
+362880
+
+

成功!

+

导出宏

+
+

译者注:导出宏 这部分内容由译者所补充。

+

这个例子的代码是放在 bin crate 中运行的,如果把 宏 的代码放在 lib crate, +main 函数放在 bin crate,那么需要做一点更改。(即使它们都处于同一个 package 下)

+
+

假设 recurrence! 和其依赖的 count_exprs! 被定义在 macs lib crate, +根据 导入/导出宏#2018 版本 小节。

+

首先你得把这两个宏导出,否则使用 macs lib 的 crate 会找不到宏:

+
#[macro_export]
+macro_rules! count_exprs { /* */  }
+
+#[macro_export]
+macro_rules! recurrence { /* */ }
+
+

其次,你需要在 recurrence! 中引入 count_exprs!,使用:

+
// --snippet--
+
+#[macro_export]
+macro_rules! recurrence {
+    ( $seq:ident [ $ind:ident ]: $sty:ty = $($inits:expr),+ ; ... ; $recur:expr ) => {
+        {
+            use std::ops::Index;
+			use $crate::count_exprs; // 导入
+
+            const MEM_SIZE: usize = count_exprs!($($inits),+);
+
+// --snippet--
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/decl-macros/macros2.html b/decl-macros/macros2.html new file mode 100644 index 0000000..0912e2a --- /dev/null +++ b/decl-macros/macros2.html @@ -0,0 +1,377 @@ + + + + + + macro 2.0 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

声明宏 2.0

+
+

RFC: rfcs#1584
+Tracking Issue: rust#39412
+Feature: #![feature(decl_macro)]

+
+

虽然这还未稳定(或者更确切地说,还远未完成),但有人提议建立一个新的声明宏系统,该系统应该取代 +macro_rules!,并给其取名为声明宏 2.0、macrodecl_macro 或者更混乱的名称 macros-by-example

+

本章只是为了快速浏览当前状态,展示如何使用这个宏系统以及它的不同之处。

+

这里所描述的一切都不是最终成型的或完整的,因为它们可能会发生变化。

+

语法

+

我们将对前几章中实现的两个宏在 macromacro_rules 的语法之间进行比较:

+
#![feature(decl_macro)]
+
+macro_rules! replace_expr_ {
+    ($_t:tt $sub:expr) => { $sub }
+}
+macro replace_expr($_t:tt $sub:expr) {
+    $sub
+}
+
+macro_rules! count_tts_ {
+    () => { 0 };
+    ($odd:tt $($a:tt $b:tt)*) => { (count_tts!($($a)*) << 1) | 1 };
+    ($($a:tt $even:tt)*) => { count_tts!($($a)*) << 1 };
+}
+macro count_tts {
+    () => { 0 },
+    ($odd:tt $($a:tt $b:tt)*) => { (count_tts!($($a)*) << 1) | 1 },
+    ($($a:tt $even:tt)*) => { count_tts!($($a)*) << 1 },
+}
+
+fn main() {}
+

它们看起来非常相似,只是有一些不同之处,而且 macro 有两种不同的形式。

+

让我们先看 count_tts 宏,因为它看起来更像我们习惯看到的样子。虽然它看起来与 +macro_rules 的版本几乎相同,但有两个不同之处:

+
    +
  1. 它使用了 macro 关键字
  2. +
  3. 规则分隔符是 , 而不是 ;
  4. +
+

不过,macro 还有另一种形式,这是只有一条规则的宏的简写。通过 +replace_expr,我们看到,可以用一种更类似于普通函数的方式来编写定义:

+
    +
  1. 直接在宏名字后面编写 matcher
  2. +
  3. 然后去掉一对大括号和 =>,再写 transcriber
  4. +
+

调用 macro 所定义的宏,和函数式宏的语法相同,名称后跟 !,再后跟宏输入标记树。

+

macro 是规范的条目

+

macro_rules 宏是按文本限定范围的,并且如果将它视为条目,需要 #[macro_export] +(而且还可能需要重导出),但 macro 与此不同,因为 macro 宏的行为与规范的条目一样。

+

因此,你可以使用诸如 pubpub(crate)pub(in path) 之类的可见性分类符来适当地限定它们。1

+
1 +

译者注:这也意味着,macro 宏的导入导出规则符合常规条目。

+
+

卫生性

+

到目前为止,卫生性是这两个声明宏系统之间最大的区别。

+

与具有混合式卫生性 (mixed site hygiene) 的 macro_rules +不同,macro 具有定义处卫生性 (definition site hygiene),这意味着 +macro 不会将标识符泄漏到其调用之外。

+

这样,下面的代码可以使用 macro_rules 宏进行编译,但无法使用 macro 定义:

+
#![feature(decl_macro)]
+// 试着注释下面第一行,然后取消注释下面第二行,看看会发生什么
+
+macro_rules! foo {
+// macro foo {
+    ($name: ident) => {
+        pub struct $name;
+
+        impl $name {
+            pub fn new() -> $name {
+                $name
+            }
+        }
+    }
+}
+
+foo!(Foo);
+
+fn main() {
+    // this fails with a `macro`, but succeeds with a `macro_rules`
+    let foo = Foo::new();
+}
+

未来可能会有计划允许标识符卫生性逃逸 (hygiene bending)。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/decl-macros/minutiae.html b/decl-macros/minutiae.html new file mode 100644 index 0000000..1b09bfd --- /dev/null +++ b/decl-macros/minutiae.html @@ -0,0 +1,296 @@ + + + + + + 细节 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

细节问题

+

本节将介绍 macro_rules! 宏系统的一些细枝末节。你至少应该 记住 有这些东西存在。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/decl-macros/minutiae/debugging.html b/decl-macros/minutiae/debugging.html new file mode 100644 index 0000000..3073e82 --- /dev/null +++ b/decl-macros/minutiae/debugging.html @@ -0,0 +1,365 @@ + + + + + + 调试 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

调试

+
+

注意:这是一个专门为声明宏量身定做的调试工具清单,调试宏的其他方法可以在语法扩展的 +调试 章节中找到。

+
+

trace_macros!

+

最有用的是 trace_macros!,在每次声明宏展开前,它指示编译器记录下声明宏的调用信息。

+

例如:

+
// 注意:这需要 nightly Rust
+#![feature(trace_macros)]
+
+macro_rules! each_tt {
+    () => {};
+    ($_tt:tt $($rest:tt)*) => {each_tt!($($rest)*);};
+}
+
+each_tt!(foo bar baz quux);
+trace_macros!(true);
+each_tt!(spim wak plee whum);
+trace_macros!(false);
+each_tt!(trom qlip winp xod);
+
+fn main() {}
+

输出为:

+
note: trace_macro
+  --> src/main.rs:11:1
+   |
+11 | each_tt!(spim wak plee whum);
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |
+   = note: expanding `each_tt! { spim wak plee whum }`
+   = note: to `each_tt ! (wak plee whum) ;`
+   = note: expanding `each_tt! { wak plee whum }`
+   = note: to `each_tt ! (plee whum) ;`
+   = note: expanding `each_tt! { plee whum }`
+   = note: to `each_tt ! (whum) ;`
+   = note: expanding `each_tt! { whum }`
+   = note: to `each_tt ! () ;`
+   = note: expanding `each_tt! {  }`
+   = note: to ``
+
+

它在调试递归很深的宏时尤其有用。

+

此外,你可以在命令行里,给编译指令附加 -Z trace-macros 来打印追踪的宏。

+

trace_macros!(false); 之后的宏不会被这个附加指令追踪到,所以这里会追踪前两个宏。

+

参考命令:cargo rustc --bin binary_name -- -Z trace-macros

+

log_syntax!

+

另一有用的宏是 log_syntax!。它将使得编译器输出所有经过编译器处理的标记。

+

比如让编译器“唱首歌”:

+
// 注意:这需要 nightly Rust
+#![feature(log_syntax)]
+
+macro_rules! sing {
+    () => {};
+    ($tt:tt $($rest:tt)*) => {log_syntax!($tt); sing!($($rest)*);};
+}
+
+sing! {
+    ^ < @ < . @ *
+    '\x08' '{' '"' _ # ' '
+    - @ '$' && / _ %
+    ! ( '\t' @ | = >
+    ; '\x08' '\'' + '$' ? '\x7f'
+    , # '"' ~ | ) '\x07'
+}
+
+fn main() {}
+

比起 trace_macros! 来说,它能够做一些更有针对性的调试。

+

macro_railroad lib

+

另一个很棒的工具是 lukaslueg 编写的 macro_railroad lib。

+

它能可视化地生成 Rust macro_rules! 宏的语法图 (syntax diagrams)。

+

它还有一个浏览器插件,和一个可动态可视化声明宏的静态网页

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/decl-macros/minutiae/fragment-specifiers.html b/decl-macros/minutiae/fragment-specifiers.html new file mode 100644 index 0000000..c27bf64 --- /dev/null +++ b/decl-macros/minutiae/fragment-specifiers.html @@ -0,0 +1,678 @@ + + + + + + 片段分类符 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

片段分类符

+

正如在 思路 一章看到的,截至 1.60 版本, Rust 已有 +14 个片段分类符 (Fragment Specifiers,以下简称分类符)1

+

这一节会更深入地探讨他们之中的细节,每次都会展示几个匹配的例子。

+
+

注意:除了 identlifetimett 分类符之外,其余的分类符在匹配后生成的 +AST 是不清楚的 (opaque),这使得在之后的宏调用时不可能检查 (inspect) 捕获的结果。2

+
+ +
1 +

最新内容可参考 ReferenceMetavariables 一节。

+
+
2 +

推荐通过 rust quiz #9 来理解这句话。

+
+

block

+

block 分类符只匹配 +block 表达式

+

块 (block) 由 { 开始,接着是一些语句,最后是可选的表达式,然后以 } 结束。 +块的类型要么是最后的值表达式类型,要么是 () 类型。

+
macro_rules! blocks {
+    ($($block:block)*) => ();
+}
+
+blocks! {
+    {}
+    {
+        let zig;
+    }
+    { 2 }
+}
+fn main() {}
+

expr

+

expr 分类符用于匹配任何形式的表达式 +(expression)。

+

(如果把 Rust 视为面向表达式的语言,那么它有很多种表达式。)

+
macro_rules! expressions {
+    ($($expr:expr)*) => ();
+}
+
+expressions! {
+    "literal"
+    funcall()
+    future.await
+    break 'foo bar
+}
+fn main() {}
+

ident

+

ident 分类符用于匹配任何形式的标识符 +(identifier) 或者关键字。 +。

+
macro_rules! idents {
+    ($($ident:ident)*) => ();
+}
+
+idents! {
+    // _ <- `_` 不是标识符,而是一种模式
+    foo
+    async
+    O_________O
+    _____O_____
+}
+fn main() {}
+

item

+

item 分类符只匹配 Rust 的 item +的 定义 (definitions) , +不会匹配指向 item 的标识符 (identifiers)。例子:

+
macro_rules! items {
+    ($($item:item)*) => ();
+}
+
+items! {
+    struct Foo;
+    enum Bar {
+        Baz
+    }
+    impl Foo {}
+    /*...*/
+}
+fn main() {}
+

item +是在编译时完全确定的,通常在程序执行期间保持固定,并且可以驻留在只读存储器中。具体指:

+ +

lifetime

+

lifetime 分类符用于匹配生命周期注解或者标签 +(lifetime or label)。 +它与 ident 很像,但是 lifetime 会匹配到前缀 ''

+
macro_rules! lifetimes {
+    ($($lifetime:lifetime)*) => ();
+}
+
+lifetimes! {
+    'static
+    'shiv
+    '_
+}
+fn main() {}
+

literal

+

literal 分类符用于匹配字面表达式 +(literal expression)。

+
macro_rules! literals {
+    ($($literal:literal)*) => ();
+}
+
+literals! {
+    -1
+    "hello world"
+    2.3
+    b'b'
+    true
+}
+fn main() {}
+

meta

+

meta 分类符用于匹配属性 (attribute), +准确地说是属性里面的内容。通常你会在 #[$meta:meta]#![$meta:meta] 模式匹配中 +看到这个分类符。

+
macro_rules! metas {
+    ($($meta:meta)*) => ();
+}
+
+metas! {
+    ASimplePath
+    super::man
+    path = "home"
+    foo(bar)
+}
+fn main() {}
+
+

针对文档注释简单说一句: +文档注释其实是具有 #[doc="…"] 形式的属性,... 实际上就是注释字符串, +这意味着你可以在在宏里面操作文档注释!

+
+

pat

+

pat 分类符用于匹配任何形式的模式 +(pattern),包括 2021 edition +开始的 or-patterns

+
macro_rules! patterns {
+    ($($pat:pat)*) => ();
+}
+
+patterns! {
+    "literal"
+    _
+    0..5
+    ref mut PatternsAreNice
+    0 | 1 | 2 | 3 
+}
+fn main() {}
+

pat_param

+

从 2021 edition 起, or-patterns 模式开始应用,这让 pat 分类符不再允许跟随 |

+

为了避免这个问题或者说恢复旧的 pat 分类符行为,你可以使用 pat_param 片段,它允许 +| 跟在它后面,因为 pat_param 不允许 top level 或 or-patterns。

+
macro_rules! patterns {
+    (pat: $pat:pat) => {
+        println!("pat: {}", stringify!($pat));
+    };
+    (pat_param: $($pat:pat_param)|+) => {
+        $( println!("pat_param: {}", stringify!($pat)); )+
+    };
+}
+fn main() {
+    patterns! {
+       pat: 0 | 1 | 2 | 3
+    }
+    patterns! {
+       pat_param: 0 | 1 | 2 | 3
+    }
+}
+
macro_rules! patterns {
+    ($( $( $pat:pat_param )|+ )*) => ();
+}
+
+patterns! {
+    "literal"
+    _
+    0..5
+    ref mut PatternsAreNice
+    0 | 1 | 2 | 3 
+}
+fn main() {}
+

path

+

path 分类符用于匹配类型中的路径 +(TypePath)。

+

这包括函数式的 trait 形式。

+
macro_rules! paths {
+    ($($path:path)*) => ();
+}
+
+paths! {
+    ASimplePath
+    ::A::B::C::D
+    G::<eneri>::C
+    FnMut(u32) -> ()
+}
+fn main() {}
+

stmt

+

stmt 分类符只匹配的 语句 (statement)。 +除非 item 语句要求结尾有分号,否则 不会 匹配语句最后的分号。

+

什么叫 item 语句要求结尾有分号呢?单元结构体 (Unit-Struct) 就是一个简单的例子, +因为它定义中必须带上结尾的分号。

+

赶紧用例子展示上面说的是啥意思吧。下面的宏只给出它所捕获的内容,因为有几行不能通过编译。

+
macro_rules! statements {
+    ($($stmt:stmt)*) => ($($stmt)*);
+}
+
+fn main() {
+    statements! {
+        struct Foo;
+        fn foo() {}
+        let zig = 3
+        let zig = 3;
+        3
+        3;
+        if true {} else {}
+        {}
+    }
+}
+

你可以根据报错内容试着删除不能编译的代码,结合 stmt 小节开头的文字再琢磨琢磨。 +你如果正浏览使用 mdbook 渲染的页面,那么可以直接运行和修改这段代码。

+

虽然源代码编译失败,但是我们可以展开宏3, +使用 playground 的 +Expand macros 工具 (tool);或者把代码复制到本地,在 nightly Rust 版本中使用 +cargo rustc -- -Zunstable-options --pretty=expanded 命令得到宏展开结果:

+
warning: unnecessary trailing semicolon
+  --> src/main.rs:10:20
+   |
+10 |         let zig = 3;
+   |                    ^ help: remove this semicolon
+   |
+   = note: `#[warn(redundant_semicolons)]` on by default
+
+warning: unnecessary trailing semicolon
+  --> src/main.rs:12:10
+   |
+12 |         3;
+   |          ^ help: remove this semicolon
+
+#![feature(prelude_import)]
+#[prelude_import]
+use std::prelude::rust_2018::*;
+#[macro_use]
+extern crate std;
+macro_rules! statements { ($ ($ stmt : stmt) *) => ($ ($ stmt) *) ; }
+
+fn main() {
+    struct Foo;
+    fn foo() { }
+    let zig = 3;
+    let zig = 3;
+    ;
+    3;
+    3;
+    ;
+    if true { } else { }
+    { }
+}
+

由此我们知道:

+
    +
  1. +

    虽然 stmt 分类符没有捕获语句末尾的分号,但它依然在所需的时候返回了 (emit) +语句。原因很简单,分号本身就是有效的语句。所以我们实际输入 10 个语句调用了宏,而不是 8 +个!这在把多个反复捕获放入一个反复展开时很重要,因为此时反复的次数必须相同。

    +
  2. +
  3. +

    在这里你应该注意到:struct Foo; 被匹配到了。否则我们会看到像其他情况一样有一个额外 ; +语句。由前所述,这能想通:item 语句需要分号,所以这个分号能被匹配到。

    +
  4. +
  5. +

    仅由块表达式或控制流表达式组成的表达式结尾没有分号, +其余的表达式捕获后产生的表达式会尾随一个分号(在这个例子中,正是这里出错)。

    +
  6. +
+

这里提到的细节能在 Reference 的 statement +一节中找到。但个细节通常这并不重要,除了要注意反复次数,通常没什么问题。

+
3 +

可阅读 调试 一章

+
+

tt

+

tt 分类符用于匹配标记树 (TokenTree)。 +如果你是新手,对标记树不了解,那么需要回顾本书 +标记树 +一节。tt 分类符是最有作用的分类符之一,因为它能匹配几乎所有东西, +而且能够让你在使用宏之后检查 (inspect) 匹配的内容。

+

这让你可以编写非常强大的宏技巧,比如 +tt-muncher 和 +push-down-accumulator

+

ty

+

ty 分类符用于匹配任何形式的类型表达式 (type expression)。

+

类型表达式是在 Rust 中指代类型的语法。

+
macro_rules! types {
+    ($($type:ty)*) => ();
+}
+
+types! {
+    foo::bar
+    bool
+    [u8]
+    impl IntoIterator<Item = u32>
+}
+fn main() {}
+

vis

+

vis 分类符会匹配 可能为空 可见性修饰符 (Visibility qualifier)。

+
macro_rules! visibilities {
+    //         ∨~~注意这个逗号,`vis` 分类符自身不会匹配到逗号
+    ($($vis:vis,)*) => ();
+}
+
+visibilities! {
+    , // 没有 vis 也行,因为 $vis 隐式包含 `?` 的情况
+    pub,
+    pub(crate),
+    pub(in super),
+    pub(in some_path),
+}
+fn main() {}
+

vis 实际上只支持例子里的几种方式,因为这里的 visibility +指的是可见性,与私有性相对。而涉及这方面的内容只有与 pub +的关键字。所以,vis 在关心匹配输入的内容是公有还是私有时有用。

+

此外,如果匹配时,其后没有标记流,整个宏会匹配失败:

+
macro_rules! non_optional_vis {
+    ($vis:vis) => ();
+}
+non_optional_vis!();
+// ^^^^^^^^^^^^^^^^ error: missing tokens in macro arguments
+fn main() {}
+

重点在于“可能为空”。你可能想到这是隐藏了 ? +重复操作符的分类符,这样你就不用直接在反复匹配时使用 +? —— 其实你不能将它和 ? 一起在重复模式匹配中使用。

+

可以匹配 $vis:vis $ident:ident,但不能匹配 $(pub)? $ident:ident,因为 pub +表明一个有效的标识符,所以后者是模糊不清的。

+
macro_rules! vis_ident {
+    ($vis:vis $ident:ident) => ();
+}
+vis_ident!(pub foo); // this works fine
+
+macro_rules! pub_ident {
+    ($(pub)? $ident:ident) => ();
+}
+pub_ident!(pub foo);
+        // ^^^ error: local ambiguity when calling macro `pub_ident`: multiple parsing options: built-in NTs ident ('ident') or 1 other option.
+fn main() {}
+

而且,搭配 tt 分类符和递归展开去匹配空标记也会导致有趣而奇怪的事情。

+

pub 匹配了空标记,元变量依然算一次被捕获,又因为它不是 ttident 或 +lifetime,所以再次展开时是不清楚的。

+

这意味着如果这种捕获的结果传递给另一个将它视为 tt 的宏调用,你最终得到一棵空的标记树。

+
macro_rules! it_is_opaque {
+    (()) => { "()" };
+    (($tt:tt)) => { concat!("$tt is ", stringify!($tt)) };
+    ($vis:vis ,) => { it_is_opaque!( ($vis) ); }
+}
+fn main() {
+    // this prints "$tt is ", as the recursive calls hits the second branch with
+    // an empty tt, opposed to matching with the first branch!
+    println!("{}", it_is_opaque!(,));
+}
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/decl-macros/minutiae/hygiene.html b/decl-macros/minutiae/hygiene.html new file mode 100644 index 0000000..bda92b4 --- /dev/null +++ b/decl-macros/minutiae/hygiene.html @@ -0,0 +1,372 @@ + + + + + + 宏是部分“卫生的” - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

卫生性

+
+

译者注:卫生性 (hygiene) 描述的是 标识符 +在宏处理和展开过程中是“宏定义处的标识符不与外部定义的标识符交互”、“不被外部同名标识符污染的”。见 +卫生性和 Span

+
+

宏是部分卫生的

+

Rust 里的声明宏是 部分 卫生的 (partially hygienic 或者称作 mixed hygiene)。

+

具体来说,对于以下内容,声明宏是卫生的:

+
    +
  1. 局部变量 (local variables)
  2. +
  3. labels
  4. +
  5. $crate
  6. +
+

除此之外,声明宏都不是卫生的。1

+
1 +

推荐尝试 Rust Quiz #24,并阅读 “Truly Hygienic” Let Statements in Rust

+
+

之所以能做到“卫生”,是因为每个标识符都被赋予了一个看不见的“句法上下文” +(syntax context)。在比较两个标识符时,只有在标识符的原文名称和句法上下文都 +完全一样 的情况下,两个标识符才能被视作等同。

+

为阐释这一点,考虑下述代码:

+
macro_rules! using_a {
    ($e:expr) => {
        {
            let a = 42;
            $e
        }
    }
}

let four = using_a!(a / 10);
+

我们将采用背景色来表示句法上下文。现在,将上述宏调用展开如下:

+
let four = {
    let a = 42;
    a / 10
};
+

首先,回想一下,在展开的期间调用声明宏,实际是空(因为那是一棵待补全的语法树)。

+

其次,如果我们现在就尝试编译上述代码,编译器将报如下错误:

+
error[E0425]: cannot find value `a` in this scope
+  --> src/main.rs:13:21
+   |
+13 | let four = using_a!(a / 10);
+   |                     ^ not found in this scope
+

注意到宏在展开后背景色(即其句法上下文)发生了改变。 +每处宏展开均赋予其内容一个新的、独一无二的上下文。 +故而,在展开后的代码中实际上存在 两个 不同的 a,它们分别有不同的句法上下文。 +即,第一个 a 与第二个 a 并不相同,即使它们便看起来很像。

+

也就是说,被替换进宏展开中的标记仍然 保持 着它们原有的句法上下文。

+

因为它们是被传给这宏的,并非这宏本身的一部分。因此,我们作出如下修改:

+
macro_rules! using_a {
    ($a:ident, $e:expr) => {
        {
            let $a = 42;
            $e
        }
    }
}

let four = using_a!(a, a / 10);
+

展开如下:

+
let four = {
    let a = 42;
    a / 10
};
+

因为只用了一个 a(显然 a 在此处是局部变量),编译器将欣然接受此段代码。

+

$crate 元变量

+

当声明宏需要其定义所在的 (defining) crate +的其他 items 时,由于“卫生性”,我们需要使用 $crate 元变量。

+

这个特殊的元变量所做的事情是,它展开成宏所定义的 crate 的绝对路径。

+
//// 在 `helper_macro` crate 里定义 `helped!` 和 `helper!` 宏
+#[macro_export]
+macro_rules! helped {
+    // () => { helper!() } // 这行可能导致 `helper` 不在作用域的错误
+    () => { $crate::helper!() }
+}
+
+#[macro_export]
+macro_rules! helper {
+    () => { () }
+}
+
+//// 在另外的 crate 中使用这两个宏
+// 注意:`helper_macro::helper` 并没有导入进来
+use helper_macro::helped;
+
+fn unit() {
+   // 这个宏能运行通过,因为 `$crate` 正确地展开成 `helper_macro` crate 的路径(而不是使用者的路径)
+   helped!();
+}
+

请注意,$crate 用在指明非宏的 items 时,它必须和完整且有效的模块路径一起使用。如下:

+
#![allow(unused)]
+fn main() {
+pub mod inner {
+    #[macro_export]
+    macro_rules! call_foo {
+        () => { $crate::inner::foo() };
+    }
+
+    pub fn foo() {}
+}
+}
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/decl-macros/minutiae/identifiers.html b/decl-macros/minutiae/identifiers.html new file mode 100644 index 0000000..cb81b3f --- /dev/null +++ b/decl-macros/minutiae/identifiers.html @@ -0,0 +1,471 @@ + + + + + + 非标识符的“标识符” - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

非标识符的“标识符”

+
+

译者注:这里需要记住的重点是

+
    +
  1. +

    self 可以使用 ident 或者 tt 分类符来匹配;

    +
  2. +
  3. +

    _ 只能在模式中使用,不能用 ident 分类符匹配,而是用 pat 或者 +tt 分类符匹配。

    +
  4. +
+
+

有两个标记,当你最终撞见时,很有可能认为它们是标识符 (ident),但实际上它们不是。

+

然而正是这些标记,在某些情况下又的确是标识符。

+

self

+

第一个是 self。毫无疑问,它是一个 关键词 (keyword)。在一般的 Rust +代码中,不可能出现把它解读成标识符的情况;但在宏中这种情况则有可能发生:

+
macro_rules! what_is {
+    (self) => {"the keyword `self`"};
+    ($i:ident) => {concat!("the identifier `", stringify!($i), "`")};
+}
+
+macro_rules! call_with_ident {
+    ($c:ident($i:ident)) => {$c!($i)};
+}
+
+fn main() {
+    println!("{}", what_is!(self));
+    println!("{}", call_with_ident!(what_is(self)));
+}
+

上述代码的输出将是:

+
the keyword `self`
+the keyword `self`
+
+

但这说不通啊!call_with_ident! 要求一个标识符,而且它的确匹配到了,还成功替换了!所以, +self 同时是一个关键词,但又不是。你可能会想,好吧,但这鬼东西哪里重要呢?看看这个:

+
macro_rules! make_mutable {
+    ($i:ident) => {let mut $i = $i;};
+}
+
+struct Dummy(i32);
+
+impl Dummy {
+    fn double(self) -> Dummy {
+        make_mutable!(self);
+        self.0 *= 2;
+        self
+    }
+}
+
+fn main() {
+    println!("{:?}", Dummy(4).double().0);
+}
+

编译它会失败,并报错:

+
error: `mut` must be followed by a named binding
+ --> src/main.rs:2:24
+  |
+2 |     ($i:ident) => {let mut $i = $i;};
+  |                        ^^^^^^ help: remove the `mut` prefix: `self`
+...
+9 |         make_mutable!(self);
+  |         -------------------- in this macro invocation
+  |
+  = note: `mut` may be followed by `variable` and `variable @ pattern`
+

所以说,宏在匹配的时候,会欣然把 self 当作标识符接受,进而允许你把 self +带到那些实际上没办法使用的情况中去。但是,也成吧,既然得同时记住 self +既是关键词又是标识符,那下面这个讲道理应该可行,对吧?

+
macro_rules! make_self_mutable {
+    ($i:ident) => {let mut $i = self;};
+}
+
+struct Dummy(i32);
+
+impl Dummy {
+    fn double(self) -> Dummy {
+        make_self_mutable!(mut_self);
+        mut_self.0 *= 2;
+        mut_self
+    }
+}
+
+fn main() {
+    println!("{:?}", Dummy(4).double().0);
+}
+

实际上也不行,编译错误变成:

+
error[E0424]: expected value, found module `self`
+  --> src/main.rs:2:33
+   |
+2  |       ($i:ident) => {let mut $i = self;};
+   |                                   ^^^^ `self` value is a keyword only available in methods with a `self` parameter
+...
+8  | /     fn double(self) -> Dummy {
+9  | |         make_self_mutable!(mut_self);
+   | |         ----------------------------- in this macro invocation
+10 | |         mut_self.0 *= 2;
+11 | |         mut_self
+12 | |     }
+   | |_____- this function has a `self` parameter, but a macro invocation can only access identifiers it receives from parameters
+   |
+

这同样也说不通。这简直就像是在抱怨说,它看见的两个 self 不是同一个 self +... 就搞得像关键词 self 就像标识符一样,也有卫生性。

+
macro_rules! double_method {
+    ($body:expr) => {
+        fn double(mut self) -> Dummy {
+            $body
+        }
+    };
+}
+
+struct Dummy(i32);
+
+impl Dummy {
+    double_method! {{
+        self.0 *= 2;
+        self
+    }}
+}
+
+fn main() {
+    println!("{:?}", Dummy(4).double().0);
+}
+

还是报同样的错。那这个如何:

+
macro_rules! double_method {
+    ($self_:ident, $body:expr) => {
+        fn double(mut $self_) -> Dummy {
+            $body
+        }
+    };
+}
+
+struct Dummy(i32);
+
+impl Dummy {
+    double_method! {self, {
+        self.0 *= 2;
+        self
+    }}
+}
+
+fn main() {
+    println!("{:?}", Dummy(4).double().0);
+}
+

终于管用了。所以说,self 是关键词,但如果想它变成标识符,那么同时也能是一个标识符。

+

那么,相同的道理对类似的其它东西有用吗?

+

_

+
macro_rules! double_method {
+    ($self_:ident, $body:expr) => {
+        fn double($self_) -> Dummy {
+            $body
+        }
+    };
+}
+
+struct Dummy(i32);
+
+impl Dummy {
+    double_method! {_, 0}
+}
+
+fn main() {
+    println!("{:?}", Dummy(4).double().0);
+}
+
error: no rules expected the token `_`
+  --> src/main.rs:12:21
+   |
+1  | macro_rules! double_method {
+   | -------------------------- when calling this macro
+...
+12 |     double_method! {_, 0}
+   |                     ^ no rules expected this token in macro call
+

哈,当然不行。即便它 如同 self 一样从定义上讲是标识符,但 _ +在模式以及表达式中是一个合法的 (valid) 关键词,而不是一个标识符。

+
+

你可能觉得,既然 _ 在模式中有效,那换成 $self_:pat 是不是就能一石二鸟了呢?

+

可惜了,也不行,因为 self 不是一个有效的模式。

+

如果你真想同时匹配这两个标记,仅有的办法是换用 tt 来匹配。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/decl-macros/minutiae/import-export.html b/decl-macros/minutiae/import-export.html new file mode 100644 index 0000000..d7329d3 --- /dev/null +++ b/decl-macros/minutiae/import-export.html @@ -0,0 +1,372 @@ + + + + + + 导入/导出宏 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

导入/导出

+

在 Rust 的 2015 和 2018 版本中,导入 macro_rules! 宏是不一样的。 +仍然建议阅读这两部分,因为 2018 版使用的结构在 2015 版中做出了解释。

+

2015 版本

+

#[macro_use]

+

作用域 一章中介绍的 #[macro_use] 属性 +适用于模块或者 external crates 。例如:

+
#[macro_use]
+mod macros {
+    macro_rules! X { () => { Y!(); } }
+    macro_rules! Y { () => {} }
+}
+
+X!();
+
+fn main() {}
+

#[macro_export]

+

可通过 #[macro_export] 将宏从当前crate导出。注意,这种方式 无视 所有可见性设定。

+

定义 lib 包 macs 如下:

+
mod macros {
+    #[macro_export] macro_rules! X { () => { Y!(); } }
+    #[macro_export] macro_rules! Y { () => {} }
+}
+
+// X! 和 Y! 并非在此处定义的,但它们 **的确** 被导出了(在此处可用)
+// 即便 `macros` 模块是私有的
+

下面(在使用 macs lib 的 crate 中)的代码会正常工作:

+
X!(); // X 在当前 crate 中被定义
+#[macro_use] extern crate macs; // 从 `macs` 中导入 X
+X!(); // 这里的 X 是最新声明的 X,即 `macs` crate 中导入的 X
+
+fn main() {}
+

正如 作用域 一章所说,#[macro_use] 作用于 extern crate 时, +会强制把导出的宏提到 crate 的顶层模块(根模块),所以这里无须使用 macs::macros 路径。

+
+

注意:只有在根模组中,才可将 #[macro_use] 用于 extern crate

+
+

在从 extern crate 导入宏时,可显式控制导入 哪些 宏。 +从而利用这一特性来限制命名空间污染,或是覆盖某些特定的宏。就像这样:

+
// 只导入 `X!` 这一个宏
+#[macro_use(X)] extern crate macs;
+
+// X!(); // X! 已被定义,但 Y! 未被定义。X 与 Y 无关系。
+
+macro_rules! Y { () => {} }
+
+X!(); // X 和 Y 都被定义
+
+fn main() {}
+

当导出宏时,常常出现的情况是,宏定义需要其引用所在 crate 内的非宏符号。 +由于 crate 可能被重命名等,我们可以使用一个特殊的替换变量 $crate 。 +它总将被扩展为宏定义所在的 crate 的绝对路径(比如 :: macs )。

+

如果你的编译器版本小于 1.30(即 2018 版之前),那么这招并不适用于宏。 +也就是说,你没办法采用类似 $crate::Y! 的代码来引用自己 crate 里的定义的宏。 +这表示结合 #[macro_use] 来选择性导入会无法保证某个名称的宏在另一个 crate 导入同名宏时依然可用。

+

推荐的做法是,在引用非宏名称时,总是采用绝对路径。 +这样可以最大程度上避免冲突,包括跟标准库中名称的冲突。

+

2018 版本

+

2018 版本让使用 macro_rules! 宏更简单。 +因为新版本设法让 Rust 中某些特殊的东西更像正常的 items 。 +这意味着我们能以命名空间的方式正确导入和使用宏!

+

因此,不必使用 #[macro_use] 来导入 来自 extern crate 导出的宏 到全局命名空间, +现在我们这样做就好了:

+
use some_crate::some_macro;
+
+fn main() {
+    some_macro!("hello");
+    // as well as
+    some_crate::some_other_macro!("macro world");
+}
+

可惜,这只适用于导入外部 crate 的宏; +如果你使用在自己 crate 定义的 macro_rules! 宏, +那么依然需要把 #[macro_use] 添加到宏所定义的模块上来引入模块里面的宏。 +因而 作用域规则 就像之前谈论的那样生效。

+
+

$crate 前缀(元变量)在 2018 版中可适用于任何东西, +在 1.31 版之后,宏 和类似 item 的东西都能用 $crate 导入了。

+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/decl-macros/minutiae/metavar-and-expansion.html b/decl-macros/minutiae/metavar-and-expansion.html new file mode 100644 index 0000000..0e2726b --- /dev/null +++ b/decl-macros/minutiae/metavar-and-expansion.html @@ -0,0 +1,428 @@ + + + + + + 再谈元变量与宏展开 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

再谈元变量与宏展开

+

书写宏规则的顺序

+

一旦语法分析器开始消耗标记以匹配某捕获,整个过程便 无法停止或回溯 。 +这意味着,无论输入是什么样的,下面这个宏的第二项规则将永远无法被匹配到:

+
macro_rules! dead_rule {
+    ($e:expr) => { ... };
+    ($i:ident +) => { ... };
+}
+
+fn main() {
+    dead_rule!(x+);
+}
+

考虑当以 dead_rule!(x+) 形式调用此宏时,将会发生什么。 +解析器将从第一条规则开始试图进行匹配:它试图将输入解析为一个表达式。 +第一个标记 x 作为表达式是有效的,第二个标记——作为二元加符号 + 的节点——在表达式中也是有效的。

+

由此你可能会以为,由于输入中并不包含二元加号 + 的右侧元素, +分析器将会放弃尝试这一规则,转而尝试下一条规则。 +实则不然:分析器将会 panic 并终止整个编译过程,最终返回一个语法错误。

+

由于分析器的这一特点,下面这点尤为重要: +一般而言,在书写宏规则时,应从最具体的开始写起,依次写直到最不具体的

+

片段分类符的跟随限制

+

为防止将来的语法变动影响宏输入的解析方式, +macro_rules! 对紧接元变量后的内容施加了限制。 +在 Rust 1.52 中,能够紧跟片段分类符后面的内容具有如下限制1

+
    +
  • stmtexpr=>,; 之一
  • +
  • pat=>,=ifin 之一2
  • +
  • [pat_param]:=>,=|ifin 之一
  • +
  • pathty=>,=|;:>>>[{aswhere 之一; +或者 block 型的元变量
  • +
  • vis,、除了 priv 之外的标识符、任何以类型开头的标记、 +identtypath 型的元变量
  • +
  • 其他片段分类符所跟的内容无限制
  • +
+
2 +

使用 2021 edition 之前的 Rust,pat 依然可以跟随 |

+
+

反复匹配的情况也遵循这些限制1,也就是说:

+
    +
  1. +

    如果一个重复操作符(*+)能让一类元变量重复数次, +那么反复出现的内容就是这类元变量,反复结束之后所接的内容遵照上面的限制。

    +
  2. +
  3. +

    如果一个重复操作符(*?)让一类元变量重复零次, +那么元变量之后的内容遵照上面的限制。

    +
  4. +
+
1 +

内容来自于 Reference +follow-set-ambiguity-restrictions 一节。

+
+

编译器拒绝模糊的规则

+

解析器不会预先运行代码,这意味着如果编译器不能一次就唯一地确定如何解析宏调用, +那么编译器就带着模糊的报错信息而终止运行。 +一个触发终止运行的例子是:

+
macro_rules! ambiguity {
+    ($($i:ident)* $i2:ident) => { };
+}
+
+// error:
+//    local ambiguity: multiple parsing options: built-in NTs ident ('i') or ident ('i2').
+fn main() { ambiguity!(an_identifier); }
+

编译器不会提前看到传入的标识符之后是不是一个 ),如果提前看到的话就会解析正确。

+

不基于标记的代换

+

关于代换元变量 (substitution,这里指把已经进行宏解析的 token 再次传给宏) , +常常让人惊讶的一面是,尽管 很像 是根据标记 (token) 进行代换的,但事实并非如此 +——代换基于已经解析的 AST 节点。

+

思考下面的例子:

+
macro_rules! capture_then_match_tokens {
+    ($e:expr) => {match_tokens!($e)};
+}
+
+macro_rules! match_tokens {
+    ($a:tt + $b:tt) => {"got an addition"};
+    (($i:ident)) => {"got an identifier"};
+    ($($other:tt)*) => {"got something else"};
+}
+
+fn main() {
+    println!("{}\n{}\n{}\n",
+        match_tokens!((caravan)),
+        match_tokens!(3 + 6),
+        match_tokens!(5));
+    println!("{}\n{}\n{}",
+        capture_then_match_tokens!((caravan)),
+        capture_then_match_tokens!(3 + 6),
+        capture_then_match_tokens!(5));
+}
+

其结果:

+
got an identifier
+got an addition
+got something else
+
+got something else
+got something else
+got something else
+
+

通过解析已经传入 AST 节点的输入,代换的结果变得 很稳定:你再也无法检查其内容了, +也不再匹配内容。

+

另一个例子可能也会很令人困惑:

+
macro_rules! capture_then_what_is {
+    (#[$m:meta]) => {what_is!(#[$m])};
+}
+
+macro_rules! what_is {
+    (#[no_mangle]) => {"no_mangle attribute"};
+    (#[inline]) => {"inline attribute"};
+    ($($tts:tt)*) => {concat!("something else (", stringify!($($tts)*), ")")};
+}
+
+fn main() {
+    println!(
+        "{}\n{}\n{}\n{}",
+        what_is!(#[no_mangle]),
+        what_is!(#[inline]),
+        capture_then_what_is!(#[no_mangle]),
+        capture_then_what_is!(#[inline]),
+    );
+}
+

结果是:

+
no_mangle attribute
+inline attribute
+something else (#[no_mangle])
+something else (#[inline])
+
+

避免这个意外情况的唯一方式就是使用 ttident 或者 lifetime 分类符。 +每当你捕获到除此之外的分类符,结果将只能被用于直接输出。 +比如这里使用的 stringify!3,它是一条内置于编译器的语法拓展 +(查看源码可知), +将所有输入标记结合在一起,作为单个字符串输出。

+
3 +

这里未包含原作对 stringify! 用于替换 (substitution) 场景的 解读,因为那个例子的结果有些变化。

+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/decl-macros/minutiae/metavar-expr.html b/decl-macros/minutiae/metavar-expr.html new file mode 100644 index 0000000..fdafbbd --- /dev/null +++ b/decl-macros/minutiae/metavar-expr.html @@ -0,0 +1,465 @@ + + + + + + 元变量表达式 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

元变量表达式

+
+

RFC: rfcs#1584
+Tracking Issue: rust#83527
+Feature: #![feature(macro_metavar_expr)]

+
+
+

注意:示例代码片段非常简单,只试图展示它们是如何工作的。
+关于这些元变量表达式,如果你认为你有合适的、单独使用的小片段,请提交它们!

+
+

正如在 思路 中提到的,Rust 有一些特殊的元变量表达式(以下简称表达式):transcriber1 +可以使用这些表达式来获取有关元变量的信息。如果没有这些表达式,它们所提供的信息就很难甚至不可能获得。

+

本章将结合用例对它们进行更深入的介绍。

+ +
1 +

译者注:在专业的讨论中,尤其涉及元变量表达式,常用 transcribe(r) 一词而不使用 expand (expansion)。

+
+

Dollar Dollar ($$)

+

$$ 表达式展开为单个 $,实际上使其成为转义的 $。这让声明宏宏生成新的声明宏。

+

因为以前的声明宏将无法转义 $,所以无法使用元变量、重复和元变量表达式。例如以下代码片段中不使用 $$,就无法使用 bar!

+
macro_rules! foo {
+    () => {
+        macro_rules! bar {
+            ( $( $any:tt )* ) => { $( $any )* };
+            // ^^^^^^^^^^^ error: attempted to repeat an expression containing no syntax variables matched as repeating at this depth
+        }
+    };
+}
+
+foo!();
+fn main() {}
+

问题很明显, foo! 的 transcriber 看到有反复捕获的意图,并试图反复捕获,但它的作用域中没有 $any +元变量,这导致它产生错误。有了 $$,我们就可以解决这个问题2,因为 foo 的 transcriber 不再尝试反复捕获。

+
#![feature(macro_metavar_expr)]
+
+macro_rules! foo {
+    () => {
+        macro_rules! bar {
+            ( $$( $$any:tt )* ) => { $$( $$any )* };
+        }
+    };
+}
+
+foo!();
+bar!();
+fn main() {}
+
2 +

译者注:在没有 $$ 之前,存在一种技巧绕过这里的问题:你可以使用 $tt 捕获 $ 来进行转义,比如这样

+
+

count(ident, depth)

+

count 表达式展开成元变量 $ident 在给定反复深度的反复次数。

+
    +
  • ident 参数必须是规则作用域中声明的元变量
  • +
  • depth 参数必须是值小于或等于元变量 $ident 出现的最大反复深度的整型字面值
  • +
  • count(ident, depth) 展开成不带后缀的整型字面值标记
  • +
  • count(ident)count(ident, 0) 的简写
  • +
+
#![feature(macro_metavar_expr)]
+
+macro_rules! foo {
+    ( $( $outer:ident ( $( $inner:ident ),* ) ; )* ) => {
+        println!("count(outer, 0): $outer repeats {} times", ${count($outer)});
+        println!("count(inner, 0): The $inner repetition repeats {} times in the outer repetition", ${count($inner, 0)});
+        println!("count(inner, 1): $inner repeats {} times in the inner repetitions", ${count($inner, 1)});
+    };
+}
+
+fn main() {
+    foo! {
+        outer () ;
+        outer ( inner , inner ) ;
+        outer () ;
+        outer ( inner ) ;
+    };
+}
+

index(depth)

+

index(depth) 表达式展开为给定反复深度下,当前的迭代索引。

+
    +
  • depth 参数表明在第几层反复,这个数字从最内层反复调用表达式开始向外计算
  • +
  • index(depth) 展开成不带后缀的整型字面值标记
  • +
  • index()index(0) 的简写
  • +
+
#![feature(macro_metavar_expr)]
+
+macro_rules! attach_iteration_counts {
+    ( $( ( $( $inner:ident ),* ) ; )* ) => {
+        ( $(
+            $((
+                stringify!($inner),
+                ${index(1)}, // 这指的是外层反复
+                ${index()}  // 这指的是内层反复,等价于 `index(0)`
+            ),)*
+        )* )
+    };
+}
+
+fn main() {
+    let v = attach_iteration_counts! {
+        ( hello ) ;
+        ( indices , of ) ;
+        () ;
+        ( these, repetitions ) ;
+    };
+    println!("{v:?}");
+}
+

length(depth)

+

length(depth) 表达式展开为在给定反复深度的迭代次数。

+
    +
  • depth 参数表示在第几层反复,这个数字从最内层反复调用表达式开始向外计算
  • +
  • length(depth) 展开成不带后缀的整型字面值标记
  • +
  • length()length(0) 的简写
  • +
+
#![feature(macro_metavar_expr)]
+
+macro_rules! lets_count {
+    ( $( $outer:ident ( $( $inner:ident ),* ) ; )* ) => {
+        $(
+            $(
+                println!(
+                    "'{}' in inner iteration {}/{} with '{}' in outer iteration {}/{} ",
+                    stringify!($inner), ${index()}, ${len()},
+                    stringify!($outer), ${index(1)}, ${len(1)},
+                );
+            )*
+        )*
+    };
+}
+
+fn main() {
+    lets_count!(
+        many (small , things) ;
+        none () ;
+        exactly ( one ) ;
+    );
+}
+

ignore(ident)

+

ignore(ident) 表达式展开为空,这使得在无需实际展开元变量的时候,像元变量反复展开相同次数的某些内容。

+
    +
  • ident 参数必须是规则作用域中声明的元变量
  • +
+
#![feature(macro_metavar_expr)]
+
+macro_rules! repetition_tuples {
+    ( $( ( $( $inner:ident ),* ) ; )* ) => {
+        ($(
+            $(
+                (
+                    ${index()},
+                    ${index(1)}
+                    ${ignore($inner)} // without this metavariable expression, compilation would fail
+                ),
+            )*
+        )*)
+    };
+}
+
+fn main() {
+    let tuple = repetition_tuples!(
+        ( one, two ) ;
+        () ;
+        ( one ) ;
+        ( one, two, three ) ;
+    );
+    println!("{tuple:?}");
+}
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/decl-macros/minutiae/scoping.html b/decl-macros/minutiae/scoping.html new file mode 100644 index 0000000..67164bf --- /dev/null +++ b/decl-macros/minutiae/scoping.html @@ -0,0 +1,497 @@ + + + + + + 作用域 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

作用域

+
+

这部分最新的内容可参考 Reference 的 +scoping-exporting-and-importing +一节。部分翻译内容引自 Reference +中文版

+
+

函数式宏的作用域规则可能有一点反直觉。(函数式宏包括声明宏与函数式过程宏。) +由于历史原因,宏的作用域并不完全像各种程序项那样工作。

+

有两种形式的作用域:文本作用域 (textual scope) 和 基于路径的作用域 (path-based scope)。

+

文本作用域:基于宏在源文件中(定义和使用所)出现的顺序,或是跨多个源文件出现的顺序, +文本作用域是默认的作用域。

+

基于路径的作用域:与其他程序项作用域的运行方式相同。

+

当声明宏被 非限定标识符(unqualified identifier,非多段路径段组成的限定性路径)调用时, +会首先在文本作用域中查找。 +如果文本作用域中没有任何结果,则继续在基于路径的作用域中查找。

+

如果宏的名称由路径限定 (qualified with a path) ,则只在基于路径的作用域中查找。

+

文本作用域

+

宏在子模块中可见

+

与 Rust 语言其余所有部分都不同的是,函数式宏在子模块中仍然可见。

+
macro_rules! X { () => {}; }
+mod a {
+    X!(); // defined
+}
+mod b {
+    X!(); // defined
+}
+mod c {
+    X!(); // defined
+}
+fn main() {}
+
+

注意:即使子模组的内容处在不同文件中,这些例子中所述的行为仍然保持不变。

+
+

宏在定义之后可见

+

同样与 Rust 语言其余所有部分不同,宏只有在其定义 之后 可见。 +下例展示了这一点。同时注意到,它也展示了宏不会“漏出” (leak) 其定义所在的作用域:

+
mod a {
+    // X!(); // undefined
+}
+mod b {
+    // X!(); // undefined
+    macro_rules! X { () => {}; }
+    X!(); // defined
+}
+mod c {
+    // X!(); // undefined
+}
+fn main() {}
+

要清楚,即使你把宏移动到外层作用域,词法依赖顺序的规则依然适用。

+
mod a {
+    // X!(); // undefined
+}
+
+macro_rules! X { () => {}; }
+
+mod b {
+    X!(); // defined
+}
+mod c {
+    X!(); // defined
+}
+fn main() {}
+

宏与宏之间顺序无关

+

然而对于宏自身来说,这种具有顺序的依赖行为不存在。 +即被调用的宏可以先于调用宏之前声明:

+
mod a {
+    // X!(); // undefined
+}
+
+macro_rules! X { () => { Y!(); }; } // 注意这里的代码运行通过
+
+mod b {
+    // 注意这里 X 虽然被定义,但是 Y 不被定义,所以不能使用 X
+    // X!(); // defined, but Y! is undefined 
+}
+
+macro_rules! Y { () => {}; }
+
+mod c {
+    X!(); // defined, and so is Y!
+}
+fn main() {}
+

宏可以被暂时覆盖

+

允许多次定义 macro_rules! 宏,最后声明的宏会简单地覆盖 (shadow) 上一个声明的同名宏; +如果最后声明的宏离开作用域,上一个宏在有效的作用域内还能被使用。

+
macro_rules! X { (1) => {}; }
+X!(1);
+macro_rules! X { (2) => {}; }
+// X!(1); // Error: no rule matches `1`
+X!(2);
+
+mod a {
+    macro_rules! X { (3) => {}; }
+    // X!(2); // Error: no rule matches `2`
+    X!(3);
+}
+// X!(3); // Error: no rule matches `3`
+X!(2);
+
+fn main() { }
+

#[macro_use] 属性

+

这个属性放置在宏定义所在的模块前 或者 extern crate 语句前。

+
    +
  1. 在模块前加上 #[macro_use] 属性:导出该模块内的所有宏, +从而让导出的宏在所定义的模块结束之后依然可用。
  2. +
+
mod a {
+    // X!(); // undefined
+}
+
+#[macro_use]
+mod b {
+    macro_rules! X { () => {}; }
+    X!(); // defined
+}
+
+mod c {
+    X!(); // defined
+}
+fn main() {}
+

注意,这可能会产生一些奇怪的后果,因为宏(包括过程宏)中的标识符只有在宏展开的过程中才会被解析。

+
mod a {
+    // X!(); // undefined
+}
+
+#[macro_use]
+mod b {
+    macro_rules! X { () => { Y!(); }; }
+    // X!(); // defined, but Y! is undefined
+}
+
+macro_rules! Y { () => {}; }
+
+mod c {
+    X!(); // defined, and so is Y!
+}
+fn main() {}
+
    +
  1. extern crate 语句加上 #[macro_use] 属性: +把外部 crate 定义且导出的宏引入当前 crate 的根/顶层模块。(当前 crate 使用外部 crate)
  2. +
+

假设在外部名称为 mac 的 crate 中定义了 X! 宏,在当前模块:

+
//// 这里的 `X!` 与 `Y!` 无关,前者定义于外部 crate,后者定义于当前 crate
+
+mod a {
+    // X!(); // defined, but Y! is undefined
+}
+
+macro_rules! Y { () => {}; }
+
+mod b {
+    X!(); // defined, and so is Y!
+}
+
+#[macro_use] extern crate macs;
+mod c {
+    X!(); // defined, and so is Y!
+}
+
+fn main() {}
+

当宏放在函数内

+

前四条作用域规则同样适用于函数。 +至于第五条规则, #[macro_use] 属性并不直接作用于函数。

+
macro_rules! X {
+    () => { Y!() };
+}
+
+fn a() {
+    macro_rules! Y { () => {"Hi!"} }
+    assert_eq!(X!(), "Hi!");
+    {
+        assert_eq!(X!(), "Hi!");
+        macro_rules! Y { () => {"Bye!"} }
+        assert_eq!(X!(), "Bye!");
+    }
+    assert_eq!(X!(), "Hi!");
+}
+
+fn b() {
+    macro_rules! Y { () => {"One more"} }
+    assert_eq!(X!(), "One more");
+}
+
+fn main() {
+    a();
+    b();
+}
+

关于宏声明的位置

+

由于前述种种规则,一般来说, +建议将所有应对整个 crate 均可见的宏的定义置于根模块的最顶部, +借以确保它们 一直 可用。 +这个建议和适用于在文件 mod 定义的宏:

+
#[macro_use]
+mod some_mod_that_defines_macros;
+mod some_mod_that_uses_those_macros;
+

这里的顺序很重要,因为第二个模块依赖于第一个模块的宏, +所以改变这两个模块的顺序会无法编译。

+

基于路径的作用域

+

Rust 的 macro_rules! 宏 默认并没有基于路径的作用域。

+

然而,如果这个宏被加上 #[macro_export] 属性,那么它就在 crate 的根作用域里被定义, +而且能直接使用它。

+

导入/导出宏 一章会更深入地探讨这个属性。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/decl-macros/patterns.html b/decl-macros/patterns.html new file mode 100644 index 0000000..ff2202c --- /dev/null +++ b/decl-macros/patterns.html @@ -0,0 +1,296 @@ + + + + + + 模式 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

模式

+

解析和展开模式。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/decl-macros/patterns/callbacks.html b/decl-macros/patterns/callbacks.html new file mode 100644 index 0000000..f427e2b --- /dev/null +++ b/decl-macros/patterns/callbacks.html @@ -0,0 +1,344 @@ + + + + + + 回调 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

回调

+
macro_rules! call_with_larch {
+    ($callback:ident) => { $callback!(larch) };
+}
+
+macro_rules! expand_to_larch {
+    () => { larch };
+}
+
+macro_rules! recognize_tree {
+    (larch) => { println!("#1, the Larch.") };
+    (redwood) => { println!("#2, the Mighty Redwood.") };
+    (fir) => { println!("#3, the Fir.") };
+    (chestnut) => { println!("#4, the Horse Chestnut.") };
+    (pine) => { println!("#5, the Scots Pine.") };
+    ($($other:tt)*) => { println!("I don't know; some kind of birch maybe?") };
+}
+
+fn main() {
+    recognize_tree!(expand_to_larch!()); // 无法直接使用 `expand_to_larch!` 的展开结果
+    call_with_larch!(recognize_tree);    // 回调就是给另一个宏传入宏的名称 (`ident`),而不是宏的结果
+}
+
+// 打印结果:
+// I don't know; some kind of birch maybe?
+// #1, the Larch.
+

由于宏展开的机制限制,(至少在最新的 Rust 中) +不可能做到把一例宏的展开结果作为有效信息提供给另一例宏。 +这为宏的模块化工作施加了难度。

+

使用递归并传递回调 (callbacks) 是条出路。 +作为演示,上例两处宏调用的展开过程如下:

+
recognize_tree! { expand_to_larch ! (  ) }
+println! { "I don't know; some kind of birch maybe?" }
+// ...
+
+call_with_larch! { recognize_tree }
+recognize_tree! { larch }
+println! { "#1, the Larch." }
+// ...
+

可以反复匹配 tt 来将任意参数转发给回调:

+
macro_rules! callback {
+    ($callback:ident( $($args:tt)* )) => {
+        $callback!( $($args)* )
+    };
+}
+
+fn main() {
+    callback!(callback(println("Yes, this *was* unnecessary.")));
+}
+

如果需要的话,当然还可以在参数中增加额外的标记 (tokens) 。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/decl-macros/patterns/internal-rules.html b/decl-macros/patterns/internal-rules.html new file mode 100644 index 0000000..148310c --- /dev/null +++ b/decl-macros/patterns/internal-rules.html @@ -0,0 +1,376 @@ + + + + + + 内用规则 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

内用规则

+
#[macro_export]
+macro_rules! foo {
+    (@as_expr $e:expr) => {$e};
+
+    ($($tts:tt)*) => {
+        foo!(@as_expr $($tts)*)
+    };
+}
+
+fn main() {
+    assert_eq!(foo!(42), 42);
+}
+

内用规则可用在以下两种情况:

+
    +
  1. 将多个宏统一为一个;
  2. +
  3. 通过显式命名宏中调用的规则,来简化 TT “撕咬机” 的读写。
  4. +
+

那么为什么将多个宏统一为一个有用呢? +主要原因是:在 2015 版本中,未对宏进行空间命名。这导致一个问题——必须重新导出内部定义的所有宏, +从而污染整个全局宏命名空间;更糟糕的是,宏与其他 crate 的同名宏发生冲突。 +简而言之,这很造成很多麻烦。 +幸运的是,在 rustc版本 >= 1.30 的情况下(即 2018 版本之后), +这不再是问题了(但是内用规则可以减少不必要声明的宏), +有关宏导出更多信息,请参阅本书 导入/导出宏

+

好了,让我们讨论如何利用“内用规则” (internal rules) 来把多个宏统一为一个, +以及“内用规则”这项技术到底是什么吧。

+

这个例子有两个宏,一个常见的 as_expr! 宏 +和 foo! 宏,后者使用了前者。如果分开写就是下面的形式:

+
#[macro_export]
+macro_rules! as_expr { ($e:expr) => {$e} }
+
+#[macro_export]
+macro_rules! foo {
+    ($($tts:tt)*) => {
+        as_expr!($($tts)*)
+    };
+}
+
+fn main() {
+    assert_eq!(foo!(42), 42);
+}
+

这当然不是最好的解决办法,正如前面提到的,因为 as_expr 污染了全局宏命名空间。 +在这个特定的例子里,as_expr 只是一个简单的宏,它只会被使用一次, +所以,利用内用规则,把它“嵌入”到 foo 这个宏里面吧!

+

foo 仅有的一条规则前面添加一条新匹配模式(新规则), +这个匹配模式由 as_expr 组成(和命名),然后附加上宏的输入参数 $e:expr ; +在展开里填写这个宏被匹配到时具体的内容。从而得到本章开头的代码:

+
#[macro_export]
+macro_rules! foo {
+    (@as_expr $e:expr) => {$e};
+
+    ($($tts:tt)*) => {
+        foo!(@as_expr $($tts)*)
+    };
+}
+
+fn main() {
+    assert_eq!(foo!(42), 42);
+}
+

可以看到,没有调用 as_expr 宏,而是递归调用在参数前放置了特殊标记树的 foo!(@as_expr $($tts)*)。 +要是你看得仔细些,你甚至会发现这个模式能好地结合 TT 撕咬机

+

之所以用 @ ,是因为在 Rust 1.2 下,该标记尚无任何在前缀位置的用法; +因此,这个语法定义在当时不会与任何东西撞车。 +如果你想用别的符号或特有前缀都可以(比如试试 #! ), +但 @ 的用例已被传播开来,因此,使用它可能更容易帮助读者理解你的代码。

+
+

注意:@ 符号很早之前曾作为前缀被用于表示被垃圾回收了的指针, +那时 Rust 还在采用各种记号代表指针类型。

+

而现在的 @ 只有一种用法: +将名称绑定至模式中(譬如 match 的模式匹配中)。 +在这种用法中它是中缀运算符,与我们的上述用例并不冲突。

+
+

还有一点要注意,内用规则通常应排在“真正的”规则之前。 +这样做可避免 macro_rules! 错把内用规则调用解析成别的东西,比如表达式。

+

性能建议

+

内用规则的一个缺点是它们会增加编译时间。

+

即便最终只有一条规则的宏可以匹配(有效的)宏调用,但编译器必须尝试按顺序匹配所有规则。

+

如果宏有许多规则,则可能会有许多匹配失败的情况,而使用内部规则会增加此类匹配失败的数量。

+

此外,@as_expr 方式的标识符使规则变得更长,这略微增加了编译器在匹配时必须做的工作量。

+

因此,为了获得最佳性能,最好避免使用内部规则

+

避免使用它们通常也会使复杂的宏更易于阅读。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/decl-macros/patterns/push-down-acc.html b/decl-macros/patterns/push-down-acc.html new file mode 100644 index 0000000..bf04b44 --- /dev/null +++ b/decl-macros/patterns/push-down-acc.html @@ -0,0 +1,421 @@ + + + + + + 下推累积 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

下推累积

+
#![allow(unused)]
+fn main() {
+macro_rules! init_array {
+    (@accum (0, $_e:expr) -> ($($body:tt)*))
+        => {init_array!(@as_expr [$($body)*])};
+    (@accum (1, $e:expr) -> ($($body:tt)*))
+        => {init_array!(@accum (0, $e) -> ($($body)* $e,))};
+    (@accum (2, $e:expr) -> ($($body:tt)*))
+        => {init_array!(@accum (1, $e) -> ($($body)* $e,))};
+    (@accum (3, $e:expr) -> ($($body:tt)*))
+        => {init_array!(@accum (2, $e) -> ($($body)* $e,))};
+    (@as_expr $e:expr) => {$e};
+    [$e:expr; $n:tt] => {
+        {
+            let e = $e;
+            init_array!(@accum ($n, e.clone()) -> ())
+        }
+    };
+}
+
+let strings: [String; 3] = init_array![String::from("hi!"); 3];
+assert_eq!(format!("{:?}", strings), "[\"hi!\", \"hi!\", \"hi!\"]");
+}
+

在 Rust 中,所有宏最终 必须 展开为一个完整、有效的句法元素(比如表达式、条目等等)。 +这意味着,不可能定义一个最终展开为残缺构造的宏。

+

有些人可能希望,上例中的宏能被更加直截了当地表述成:

+
macro_rules! init_array {
+    (@accum 0, $_e:expr) => {/* empty */};
+    (@accum 1, $e:expr) => {$e};
+    (@accum 2, $e:expr) => {$e, init_array!(@accum 1, $e)};
+    (@accum 3, $e:expr) => {$e, init_array!(@accum 2, $e)};
+    [$e:expr; $n:tt] => {
+        {
+            let e = $e;
+            [init_array!(@accum $n, e)]
+        }
+    };
+}
+
+

他们预期的展开过程如下:

+
            [init_array!(@accum 3, e)]
+            [e, init_array!(@accum 2, e)]
+            [e, e, init_array!(@accum 1, e)]
+            [e, e, e]
+

然而,这一思路中,每个中间步骤的展开结果都是一个不完整的表达式。 +即便这些中间结果对外部来说绝不可见,Rust 仍然禁止这种用法。

+

下推累积 (push-down accumulation) 则使我们得以在完全完成之前毋需考虑构造的完整性, +进而累积构建出我们所需的标记序列。 +本章开头给出的示例中,宏调用的展开过程如下:

+
init_array! { String:: from ( "hi!" ) ; 3 }
+init_array! { @ accum ( 3 , e . clone (  ) ) -> (  ) }
+init_array! { @ accum ( 2 , e.clone() ) -> ( e.clone() , ) }
+init_array! { @ accum ( 1 , e.clone() ) -> ( e.clone() , e.clone() , ) }
+init_array! { @ accum ( 0 , e.clone() ) -> ( e.clone() , e.clone() , e.clone() , ) }
+init_array! { @ as_expr [ e.clone() , e.clone() , e.clone() , ] }
+

可以修改一下代码,看到每次调用时 $($body)* 存储的内容变化:

+
macro_rules! init_array {
+    (@accum (0, $_e:expr) -> ($($body:tt)*))
+        => {init_array!(@as_expr [$($body)*])};
+    (@accum (1, $e:expr) -> ($($body:tt)*))
+        => {init_array!(@accum (0, $e) -> ($($body)* $e+3,))};
+    (@accum (2, $e:expr) -> ($($body:tt)*))
+        => {init_array!(@accum (1, $e) -> ($($body)* $e+2,))};
+    (@accum (3, $e:expr) -> ($($body:tt)*))
+        => {init_array!(@accum (2, $e) -> ($($body)* $e+1,))};
+    (@as_expr $e:expr) => {$e};
+    [$e:expr; $n:tt $(; first $init:expr)?] => {
+        {
+            let e = $e;
+            init_array!(@accum ($n, e.clone()) -> ($($init)?,))
+        }
+    };
+}
+
+fn main() {
+    let array: [usize; 4] = init_array![0; 3; first 0];
+    println!("{:?}", array);
+}
+

根据 调试 一章的内容, +在 nightly Rust 中使用编译命令: +cargo rustc --bin my-project -- -Z trace-macros ,即得到以下输出:

+
note: trace_macro
+  --> src/main.rs:20:31
+   |
+20 |     let array: [usize; 4] = init_array![0; 3; first 0];
+   |                               ^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |
+   = note: expanding `init_array! { 0 ; 3 ; first 0 }`
+   = note: to `{ let e = 0 ; init_array! (@ accum(3, e.clone()) -> (0,)) }`
+   = note: expanding `init_array! { @ accum(3, e.clone()) -> (0,) }`
+   = note: to `init_array! (@ accum(2, e.clone()) -> (0, e.clone() + 1,))`
+   = note: expanding `init_array! { @ accum(2, e.clone()) -> (0, e.clone() + 1,) }`
+   = note: to `init_array! (@ accum(1, e.clone()) -> (0, e.clone() + 1, e.clone() + 2,))`
+   = note: expanding `init_array! { @ accum(1, e.clone()) -> (0, e.clone() + 1, e.clone() + 2,) }`
+   = note: to `init_array!
+           (@ accum(0, e.clone()) -> (0, e.clone() + 1, e.clone() + 2, e.clone() + 3,))`
+   = note: expanding `init_array! { @ accum(0, e.clone()) -> (0, e.clone() + 1, e.clone() + 2, e.clone() + 3,) }`
+   = note: to `init_array! (@ as_expr [0, e.clone() + 1, e.clone() + 2, e.clone() + 3,])`
+   = note: expanding `init_array! { @ as_expr [0, e.clone() + 1, e.clone() + 2, e.clone() + 3,] }`
+   = note: to `[0, e.clone() + 1, e.clone() + 2, e.clone() + 3]`
+

可以看到,每一步都在累积输出,直到规则完成,给出完整的表达式。

+

上述过程的关键点在于,使用 $($body:tt)* 来保存输出中间值, +而不触发其它解析机制。采用 ($input) -> ($output) +的形式仅是出于传统,用以明示此类宏的作用。

+

由于可以存储任意复杂的中间结果, +下推累积在构建 TT 撕咬机 的过程中经常被用到。 +当构造类似于这个例子的宏时,也会结合 内用规则

+

性能建议

+

下推累积本质上是二次复杂度的。考虑一个包含 100 +个标记树的累加器1,每次调用一个标记树:

+
    +
  • 初始调用将匹配空的累加器
  • +
  • 调用第一个递归将匹配 1 个标记树累加器
  • +
  • 调用下一个递归将匹配 2 个标记树累加器
  • +
  • 以此类推,最多 100 个
  • +
+

这是一个典型的二次复杂度模式,长输入会导致宏延长编译时间。

+

此外,TT 撕咬机对其输入也是天生的二次复杂度,所以同时使用 +TT 撕咬机和下推累积的宏将是双倍二次的!

+

所有关于 TT 撕咬机的性能建议都适用于下推积累。

+

一般来说,避免过多地使用它们,并尽可能地让它们的简单。

+

最后,确保将累加器放在规则的末尾,而不是开头。

+

这样,如果匹配规则失败,编译器就不必匹配(可能很长的)累加器,从而避免遇到规则中不匹配的部分。这可能会对编译时间产生很大影响。

+
1 +

译者注:accumulator,即使用下推累积方式编写的声明宏。

+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/decl-macros/patterns/repetition-replacement.html b/decl-macros/patterns/repetition-replacement.html new file mode 100644 index 0000000..ebaf0a2 --- /dev/null +++ b/decl-macros/patterns/repetition-replacement.html @@ -0,0 +1,333 @@ + + + + + + 反复替换 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

反复替换

+
macro_rules! replace_expr {
+    ($_t:tt $sub:expr) => {$sub};
+}
+

在上面代码的模式中,匹配到的重复序列将被直接丢弃, +仅留用它所带来的长度信息(以及元素的类型信息); +且原本标记所在的位置将被替换成某种重复元素。

+

举个例子,考虑如何为一个元素多于12个 (Rust 1.2 下的元组元素个数的最大值) +的 tuple 提供默认值。

+
macro_rules! tuple_default {
+    ($($tup_tys:ty),*) => {
+        (
+            $(
+                replace_expr!(
+                    ($tup_tys)
+                    Default::default()
+                ),
+            )*
+        )
+    };
+}
+
+macro_rules! replace_expr {
+    ($_t:tt $sub:expr) => {
+        $sub
+    };
+}
+
+fn main() {
+    assert_eq!(tuple_default!(i32, bool, String),
+               (i32::default(), bool::default(), String::default()));
+}
+
+

仅对此例: +我们其实可以直接用 $tup_tys::default()

+
+

上例中,我们 并未真正使用 匹配到的类型。 +实际上,我们把它丢弃了,并用一个表达式重复替代 (repetition replacement) 。 +换句话说,我们实际关心的不是有哪些类型,而是有多少个类型。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/decl-macros/patterns/tt-bundling.html b/decl-macros/patterns/tt-bundling.html new file mode 100644 index 0000000..27bb89b --- /dev/null +++ b/decl-macros/patterns/tt-bundling.html @@ -0,0 +1,350 @@ + + + + + + tt 捆绑 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

TT 捆绑

+
macro_rules! call_a_or_b_on_tail {
+    ((a: $a:ident, b: $b:ident), call a: $($tail:tt)*) => {
+        $a(stringify!($($tail)*))
+    };
+
+    ((a: $a:ident, b: $b:ident), call b: $($tail:tt)*) => {
+        $b(stringify!($($tail)*))
+    };
+
+    ($ab:tt, $_skip:tt $($tail:tt)*) => {
+        call_a_or_b_on_tail!($ab, $($tail)*)
+    };
+}
+
+fn compute_len(s: &str) -> Option<usize> {
+    Some(s.len())
+}
+
+fn show_tail(s: &str) -> Option<usize> {
+    println!("tail: {:?}", s);
+    None
+}
+
+fn main() {
+    assert_eq!(
+        call_a_or_b_on_tail!(
+            (a: compute_len, b: show_tail),
+            the recursive part that skips over all these
+            tokens doesn't much care whether we will call a
+            or call b: only the terminal rules care.
+        ),
+        None
+    );
+    assert_eq!(
+        call_a_or_b_on_tail!(
+            (a: compute_len, b: show_tail),
+            and now, to justify the existence of two paths
+            we will also call a: its input should somehow
+            be self-referential, so let's make it return
+            some eighty-six!
+        ),
+        Some(92)
+    );
+}
+

在十分复杂的递归宏中,可能需要非常多的参数, +才足以在每层调用之间传递必要的标识符与表达式。 +然而,根据实现上的差异,可能存在许多这样的中间层, +它们转发了 (forward) 这些参数,但并没有用到。

+

因此,将所有这些参数捆绑 (bundle) 在一起,通过分组将其放进单独一棵标记树 tt 里, +可以省事许多。这样一来,那些用不到这些参数的递归层可以直接捕获并替换这棵标记树, +而不需要把整组参数完完全全准准确确地捕获替换掉。

+

上面的例子把表达式 $a$b 捆绑起来, +然后作为一棵 tt 交由递归规则处理。 +随后,终结规则 (terminal rules) 将这组标记解构 (destructure) , +并访问其中的表达式。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/decl-macros/patterns/tt-muncher.html b/decl-macros/patterns/tt-muncher.html new file mode 100644 index 0000000..bc493f3 --- /dev/null +++ b/decl-macros/patterns/tt-muncher.html @@ -0,0 +1,405 @@ + + + + + + tt “撕咬机“ - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

增量式 TT “撕咬机”

+
+

译者注:原文标题为 incremental TT muncher

+
+
macro_rules! mixed_rules {
+    () => {};
+    (trace $name:ident; $($tail:tt)*) => {
+        {
+            println!(concat!(stringify!($name), " = {:?}"), $name);
+            mixed_rules!($($tail)*);
+        }
+    };
+    (trace $name:ident = $init:expr; $($tail:tt)*) => {
+        {
+            let $name = $init;
+            println!(concat!(stringify!($name), " = {:?}"), $name);
+            mixed_rules!($($tail)*);
+        }
+    };
+}
+
+fn main() {
+    let a = 42;
+    let b = "Ho-dee-oh-di-oh-di-oh!";
+    let c = (false, 2, 'c');
+    mixed_rules!(
+        trace a;
+        trace b;
+        trace c;
+        trace b = "They took her where they put the crazies.";
+        trace b;
+    );
+}
+

此模式可能是 最强大 的宏解析技巧。通过使用它,一些极其复杂的语法都能得到解析。

+

“标记树撕咬机” (TT muncher) 是一种递归宏,其工作机制有赖于对输入的顺次、逐步处理 +(incrementally processing) 。处理过程的每一步中,它都将匹配并移除(“撕咬”掉)输入头部 +(start) 的一列标记 (tokens),得到一些中间结果,然后再递归地处理输入剩下的尾部。

+

名称中含有“标记树”,是因为输入中尚未被处理的部分总是被捕获在 $($tail:tt)* +的形式中。之所以如此,是因为只有通过使用反复匹配 tt 才能做到 无损地 +(losslessly) 捕获住提供给宏的输入部分。

+

标记树撕咬机仅有的限制,也是整个宏系统的局限:

+
    +
  • 你只能匹配 macro_rules! 捕获到的字面值和语法结构。
  • +
  • 你无法匹配不成对的标记组 (unbalanced group) 。
  • +
+

然而,需要把宏递归的局限性纳入考量。macro_rules! 没有做任何形式的尾递归消除或优化。

+

在写标记树撕咬机时,建议多花些功夫,尽可能地限制递归调用的次数。

+

以下两种做法帮助你做到限制宏递归:

+
    +
  1. 对于输入的变化,增加额外的匹配规则(而不是采用中间层并使用递归)1
  2. +
  3. 对输入句法施加限制,以便于记录追踪标准式的反复匹配。
  4. +
+
1 +

例子见 计数-递归

+
+

+

性能建议

+
+

译者注:要点是

+
    +
  1. 可以一次处理很多标记来减少递归次数(比如运用反复匹配)
  2. +
  3. 可以编写规则简单的宏,然后多次调用
  4. +
  5. 把容易匹配到的规则放到前面,以减少匹配次数(因为规则顺序决定了匹配顺序)
  6. +
+
+

TT 撕咬机天生就是二次复杂度的。考虑一个 TT 撕咬机 +规则,它消耗一个标记树,然后递归地在其余输入上调用自身。如果向其传递 100 个标记树:

+
    +
  • 初始调用将匹配所有的 100 个标记树。
  • +
  • 第 1 个递归调用将匹配 99 个标记树。
  • +
  • 下一次递归调用将匹配 98 个标记树。
  • +
  • 依此类推,直到匹配最后 1 个标记树。
  • +
+

这是一个典型的二次复杂度模式,过长的输入会导致宏展开延长编译时间。

+

因此,尽量避免过多地使用 TT 撕咬机,特别是在输入较长的情况下。

+

recursion_limit 属性的缺省值 (目前是 128 ) +是一个良好的健全性检查;如果你必须超过它,那么可能会遇到麻烦。

+

建议是,你可以选择编写一个:

+
    +
  1. 一次调用就能处理多件事情的 TT 撕咬机
  2. +
  3. 或者多次调用来处理一件事情的更简单的宏(这种宏从性能角度看,是更推荐的做法)
  4. +
+

例如,别这样写:

+
#![allow(unused)]
+fn main() {
+macro_rules! f { ($($tt:tt)*) => {} }
+f! {
+    fn f_u8(x: u32) -> u8;
+    fn f_u16(x: u32) -> u16;
+    fn f_u32(x: u32) -> u32;
+    fn f_u64(x: u64) -> u64;
+    fn f_u128(x: u128) -> u128;
+}
+}
+

应该这样写:

+
#![allow(unused)]
+fn main() {
+macro_rules! f { ($($tt:tt)*) => {} }
+f! { fn f_u8(x: u32) -> u8; }
+f! { fn f_u16(x: u32) -> u16; }
+f! { fn f_u32(x: u32) -> u32; }
+f! { fn f_u64(x: u64) -> u64; }
+f! { fn f_u128(x: u128) -> u128; }
+}
+

宏的输入越长,第二种编写方式就越有可能缩短编译时间。

+

此外,如果 TT 撕咬机有许多规则,请 尽可能把最频繁匹配的规则放到前面 +。这避免了不必要的匹配失败。(事实上,这对任何类型的声明性宏都是很好的建议,而不仅仅是 +TT 撕咬机。)

+

最后,优先使用正常的反复匹配(*+)来编写宏,这比 TT 撕咬机更好。如果每次调用 +TT 撕咬机时,一次只处理一个标记,则最有可能出现这种情况。

+

在更复杂的情况下,可以参考 quote! 使用的一种高级技术,它可以避免二次复杂度,而且不会达到递归上限,但代价是一些复杂的概念。详情请参考此处

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/editor.js b/editor.js new file mode 100644 index 0000000..464790c --- /dev/null +++ b/editor.js @@ -0,0 +1,29 @@ +"use strict"; +window.editors = []; +(function(editors) { + if (typeof(ace) === 'undefined' || !ace) { + return; + } + + Array.from(document.querySelectorAll('.editable')).forEach(function(editable) { + let display_line_numbers = window.playground_line_numbers || false; + + let editor = ace.edit(editable); + editor.setOptions({ + highlightActiveLine: false, + showPrintMargin: false, + showLineNumbers: display_line_numbers, + showGutter: display_line_numbers, + maxLines: Infinity, + fontSize: "0.875em" // please adjust the font size of the code in general.css + }); + + editor.$blockScrolling = Infinity; + + editor.getSession().setMode("ace/mode/rust"); + + editor.originalCode = editor.getValue(); + + editors.push(editor); + }); +})(window.editors); diff --git a/elasticlunr.min.js b/elasticlunr.min.js new file mode 100644 index 0000000..94b20dd --- /dev/null +++ b/elasticlunr.min.js @@ -0,0 +1,10 @@ +/** + * elasticlunr - http://weixsong.github.io + * Lightweight full-text search engine in Javascript for browser search and offline search. - 0.9.5 + * + * Copyright (C) 2017 Oliver Nightingale + * Copyright (C) 2017 Wei Song + * MIT Licensed + * @license + */ +!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.toArray();o + + + + diff --git a/fonts/OPEN-SANS-LICENSE.txt b/fonts/OPEN-SANS-LICENSE.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/fonts/OPEN-SANS-LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/fonts/SOURCE-CODE-PRO-LICENSE.txt b/fonts/SOURCE-CODE-PRO-LICENSE.txt new file mode 100644 index 0000000..366206f --- /dev/null +++ b/fonts/SOURCE-CODE-PRO-LICENSE.txt @@ -0,0 +1,93 @@ +Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/fonts/fonts.css b/fonts/fonts.css new file mode 100644 index 0000000..858efa5 --- /dev/null +++ b/fonts/fonts.css @@ -0,0 +1,100 @@ +/* Open Sans is licensed under the Apache License, Version 2.0. See http://www.apache.org/licenses/LICENSE-2.0 */ +/* Source Code Pro is under the Open Font License. See https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL */ + +/* open-sans-300 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 300; + src: local('Open Sans Light'), local('OpenSans-Light'), + url('open-sans-v17-all-charsets-300.woff2') format('woff2'); +} + +/* open-sans-300italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 300; + src: local('Open Sans Light Italic'), local('OpenSans-LightItalic'), + url('open-sans-v17-all-charsets-300italic.woff2') format('woff2'); +} + +/* open-sans-regular - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 400; + src: local('Open Sans Regular'), local('OpenSans-Regular'), + url('open-sans-v17-all-charsets-regular.woff2') format('woff2'); +} + +/* open-sans-italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 400; + src: local('Open Sans Italic'), local('OpenSans-Italic'), + url('open-sans-v17-all-charsets-italic.woff2') format('woff2'); +} + +/* open-sans-600 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 600; + src: local('Open Sans SemiBold'), local('OpenSans-SemiBold'), + url('open-sans-v17-all-charsets-600.woff2') format('woff2'); +} + +/* open-sans-600italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 600; + src: local('Open Sans SemiBold Italic'), local('OpenSans-SemiBoldItalic'), + url('open-sans-v17-all-charsets-600italic.woff2') format('woff2'); +} + +/* open-sans-700 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 700; + src: local('Open Sans Bold'), local('OpenSans-Bold'), + url('open-sans-v17-all-charsets-700.woff2') format('woff2'); +} + +/* open-sans-700italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 700; + src: local('Open Sans Bold Italic'), local('OpenSans-BoldItalic'), + url('open-sans-v17-all-charsets-700italic.woff2') format('woff2'); +} + +/* open-sans-800 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 800; + src: local('Open Sans ExtraBold'), local('OpenSans-ExtraBold'), + url('open-sans-v17-all-charsets-800.woff2') format('woff2'); +} + +/* open-sans-800italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 800; + src: local('Open Sans ExtraBold Italic'), local('OpenSans-ExtraBoldItalic'), + url('open-sans-v17-all-charsets-800italic.woff2') format('woff2'); +} + +/* source-code-pro-500 - latin_vietnamese_latin-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; + src: url('source-code-pro-v11-all-charsets-500.woff2') format('woff2'); +} diff --git a/fonts/open-sans-v17-all-charsets-300.woff2 b/fonts/open-sans-v17-all-charsets-300.woff2 new file mode 100644 index 0000000..9f51be3 Binary files /dev/null and b/fonts/open-sans-v17-all-charsets-300.woff2 differ diff --git a/fonts/open-sans-v17-all-charsets-300italic.woff2 b/fonts/open-sans-v17-all-charsets-300italic.woff2 new file mode 100644 index 0000000..2f54544 Binary files /dev/null and b/fonts/open-sans-v17-all-charsets-300italic.woff2 differ diff --git a/fonts/open-sans-v17-all-charsets-600.woff2 b/fonts/open-sans-v17-all-charsets-600.woff2 new file mode 100644 index 0000000..f503d55 Binary files /dev/null and b/fonts/open-sans-v17-all-charsets-600.woff2 differ diff --git a/fonts/open-sans-v17-all-charsets-600italic.woff2 b/fonts/open-sans-v17-all-charsets-600italic.woff2 new file mode 100644 index 0000000..c99aabe Binary files /dev/null and b/fonts/open-sans-v17-all-charsets-600italic.woff2 differ diff --git a/fonts/open-sans-v17-all-charsets-700.woff2 b/fonts/open-sans-v17-all-charsets-700.woff2 new file mode 100644 index 0000000..421a1ab Binary files /dev/null and b/fonts/open-sans-v17-all-charsets-700.woff2 differ diff --git a/fonts/open-sans-v17-all-charsets-700italic.woff2 b/fonts/open-sans-v17-all-charsets-700italic.woff2 new file mode 100644 index 0000000..12ce3d2 Binary files /dev/null and b/fonts/open-sans-v17-all-charsets-700italic.woff2 differ diff --git a/fonts/open-sans-v17-all-charsets-800.woff2 b/fonts/open-sans-v17-all-charsets-800.woff2 new file mode 100644 index 0000000..c94a223 Binary files /dev/null and b/fonts/open-sans-v17-all-charsets-800.woff2 differ diff --git a/fonts/open-sans-v17-all-charsets-800italic.woff2 b/fonts/open-sans-v17-all-charsets-800italic.woff2 new file mode 100644 index 0000000..eed7d3c Binary files /dev/null and b/fonts/open-sans-v17-all-charsets-800italic.woff2 differ diff --git a/fonts/open-sans-v17-all-charsets-italic.woff2 b/fonts/open-sans-v17-all-charsets-italic.woff2 new file mode 100644 index 0000000..398b68a Binary files /dev/null and b/fonts/open-sans-v17-all-charsets-italic.woff2 differ diff --git a/fonts/open-sans-v17-all-charsets-regular.woff2 b/fonts/open-sans-v17-all-charsets-regular.woff2 new file mode 100644 index 0000000..8383e94 Binary files /dev/null and b/fonts/open-sans-v17-all-charsets-regular.woff2 differ diff --git a/fonts/source-code-pro-v11-all-charsets-500.woff2 b/fonts/source-code-pro-v11-all-charsets-500.woff2 new file mode 100644 index 0000000..7222456 Binary files /dev/null and b/fonts/source-code-pro-v11-all-charsets-500.woff2 differ diff --git a/highlight.css b/highlight.css new file mode 100644 index 0000000..352c79b --- /dev/null +++ b/highlight.css @@ -0,0 +1,83 @@ +/* + * An increased contrast highlighting scheme loosely based on the + * "Base16 Atelier Dune Light" theme by Bram de Haan + * (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) + * Original Base16 color scheme by Chris Kempson + * (https://github.com/chriskempson/base16) + */ + +/* Comment */ +.hljs-comment, +.hljs-quote { + color: #575757; +} + +/* Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-attr, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #d70025; +} + +/* Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #b21e00; +} + +/* Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #008200; +} + +/* Blue */ +.hljs-title, +.hljs-section { + color: #0030f2; +} + +/* Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #9d00ec; +} + +.hljs { + display: block; + overflow-x: auto; + background: #f6f7f6; + color: #000; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-addition { + color: #22863a; + background-color: #f0fff4; +} + +.hljs-deletion { + color: #b31d28; + background-color: #ffeef0; +} diff --git a/highlight.js b/highlight.js new file mode 100644 index 0000000..18d2434 --- /dev/null +++ b/highlight.js @@ -0,0 +1,54 @@ +/* + Highlight.js 10.1.1 (93fd0d73) + License: BSD-3-Clause + Copyright (c) 2006-2020, Ivan Sagalaev +*/ +var hljs=function(){"use strict";function e(n){Object.freeze(n);var t="function"==typeof n;return Object.getOwnPropertyNames(n).forEach((function(r){!Object.hasOwnProperty.call(n,r)||null===n[r]||"object"!=typeof n[r]&&"function"!=typeof n[r]||t&&("caller"===r||"callee"===r||"arguments"===r)||Object.isFrozen(n[r])||e(n[r])})),n}class n{constructor(e){void 0===e.data&&(e.data={}),this.data=e.data}ignoreMatch(){this.ignore=!0}}function t(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function r(e,...n){var t={};for(const n in e)t[n]=e[n];return n.forEach((function(e){for(const n in e)t[n]=e[n]})),t}function a(e){return e.nodeName.toLowerCase()}var i=Object.freeze({__proto__:null,escapeHTML:t,inherit:r,nodeStream:function(e){var n=[];return function e(t,r){for(var i=t.firstChild;i;i=i.nextSibling)3===i.nodeType?r+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:r,node:i}),r=e(i,r),a(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:r,node:i}));return r}(e,0),n},mergeStreams:function(e,n,r){var i=0,s="",o=[];function l(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset"}function u(e){s+=""}function d(e){("start"===e.event?c:u)(e.node)}for(;e.length||n.length;){var g=l();if(s+=t(r.substring(i,g[0].offset)),i=g[0].offset,g===e){o.reverse().forEach(u);do{d(g.splice(0,1)[0]),g=l()}while(g===e&&g.length&&g[0].offset===i);o.reverse().forEach(c)}else"start"===g[0].event?o.push(g[0].node):o.pop(),d(g.splice(0,1)[0])}return s+t(r.substr(i))}});const s="",o=e=>!!e.kind;class l{constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){this.buffer+=t(e)}openNode(e){if(!o(e))return;let n=e.kind;e.sublanguage||(n=`${this.classPrefix}${n}`),this.span(n)}closeNode(e){o(e)&&(this.buffer+=s)}value(){return this.buffer}span(e){this.buffer+=``}}class c{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){const n={kind:e,children:[]};this.add(n),this.stack.push(n)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n),n.children.forEach(n=>this._walk(e,n)),e.closeNode(n)),e}static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(e=>"string"==typeof e)?e.children=[e.children.join("")]:e.children.forEach(e=>{c._collapse(e)}))}}class u extends c{constructor(e){super(),this.options=e}addKeyword(e,n){""!==e&&(this.openNode(n),this.addText(e),this.closeNode())}addText(e){""!==e&&this.add(e)}addSublanguage(e,n){const t=e.root;t.kind=n,t.sublanguage=!0,this.add(t)}toHTML(){return new l(this,this.options).value()}finalize(){return!0}}function d(e){return e?"string"==typeof e?e:e.source:null}const g="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",h={begin:"\\\\[\\s\\S]",relevance:0},f={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[h]},p={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[h]},b={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},m=function(e,n,t={}){var a=r({className:"comment",begin:e,end:n,contains:[]},t);return a.contains.push(b),a.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),a},v=m("//","$"),x=m("/\\*","\\*/"),E=m("#","$");var _=Object.freeze({__proto__:null,IDENT_RE:"[a-zA-Z]\\w*",UNDERSCORE_IDENT_RE:"[a-zA-Z_]\\w*",NUMBER_RE:"\\b\\d+(\\.\\d+)?",C_NUMBER_RE:g,BINARY_NUMBER_RE:"\\b(0b[01]+)",RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(e={})=>{const n=/^#![ ]*\//;return e.binary&&(e.begin=function(...e){return e.map(e=>d(e)).join("")}(n,/.*\b/,e.binary,/\b.*/)),r({className:"meta",begin:n,end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)},BACKSLASH_ESCAPE:h,APOS_STRING_MODE:f,QUOTE_STRING_MODE:p,PHRASAL_WORDS_MODE:b,COMMENT:m,C_LINE_COMMENT_MODE:v,C_BLOCK_COMMENT_MODE:x,HASH_COMMENT_MODE:E,NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?",relevance:0},C_NUMBER_MODE:{className:"number",begin:g,relevance:0},BINARY_NUMBER_MODE:{className:"number",begin:"\\b(0b[01]+)",relevance:0},CSS_NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[h,{begin:/\[/,end:/\]/,relevance:0,contains:[h]}]}]},TITLE_MODE:{className:"title",begin:"[a-zA-Z]\\w*",relevance:0},UNDERSCORE_TITLE_MODE:{className:"title",begin:"[a-zA-Z_]\\w*",relevance:0},METHOD_GUARD:{begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{n.data._beginMatch!==e[1]&&n.ignoreMatch()}})}}),N="of and for in not or if then".split(" ");function w(e,n){return n?+n:function(e){return N.includes(e.toLowerCase())}(e)?0:1}const R=t,y=r,{nodeStream:k,mergeStreams:O}=i,M=Symbol("nomatch");return function(t){var a=[],i={},s={},o=[],l=!0,c=/(^(<[^>]+>|\t|)+|\n)/gm,g="Could not find the language '{}', did you forget to load/include a language module?";const h={disableAutodetect:!0,name:"Plain text",contains:[]};var f={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:u};function p(e){return f.noHighlightRe.test(e)}function b(e,n,t,r){var a={code:n,language:e};S("before:highlight",a);var i=a.result?a.result:m(a.language,a.code,t,r);return i.code=a.code,S("after:highlight",i),i}function m(e,t,a,s){var o=t;function c(e,n){var t=E.case_insensitive?n[0].toLowerCase():n[0];return Object.prototype.hasOwnProperty.call(e.keywords,t)&&e.keywords[t]}function u(){null!=y.subLanguage?function(){if(""!==A){var e=null;if("string"==typeof y.subLanguage){if(!i[y.subLanguage])return void O.addText(A);e=m(y.subLanguage,A,!0,k[y.subLanguage]),k[y.subLanguage]=e.top}else e=v(A,y.subLanguage.length?y.subLanguage:null);y.relevance>0&&(I+=e.relevance),O.addSublanguage(e.emitter,e.language)}}():function(){if(!y.keywords)return void O.addText(A);let e=0;y.keywordPatternRe.lastIndex=0;let n=y.keywordPatternRe.exec(A),t="";for(;n;){t+=A.substring(e,n.index);const r=c(y,n);if(r){const[e,a]=r;O.addText(t),t="",I+=a,O.addKeyword(n[0],e)}else t+=n[0];e=y.keywordPatternRe.lastIndex,n=y.keywordPatternRe.exec(A)}t+=A.substr(e),O.addText(t)}(),A=""}function h(e){return e.className&&O.openNode(e.className),y=Object.create(e,{parent:{value:y}})}function p(e){return 0===y.matcher.regexIndex?(A+=e[0],1):(L=!0,0)}var b={};function x(t,r){var i=r&&r[0];if(A+=t,null==i)return u(),0;if("begin"===b.type&&"end"===r.type&&b.index===r.index&&""===i){if(A+=o.slice(r.index,r.index+1),!l){const n=Error("0 width match regex");throw n.languageName=e,n.badRule=b.rule,n}return 1}if(b=r,"begin"===r.type)return function(e){var t=e[0],r=e.rule;const a=new n(r),i=[r.__beforeBegin,r["on:begin"]];for(const n of i)if(n&&(n(e,a),a.ignore))return p(t);return r&&r.endSameAsBegin&&(r.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")),r.skip?A+=t:(r.excludeBegin&&(A+=t),u(),r.returnBegin||r.excludeBegin||(A=t)),h(r),r.returnBegin?0:t.length}(r);if("illegal"===r.type&&!a){const e=Error('Illegal lexeme "'+i+'" for mode "'+(y.className||"")+'"');throw e.mode=y,e}if("end"===r.type){var s=function(e){var t=e[0],r=o.substr(e.index),a=function e(t,r,a){let i=function(e,n){var t=e&&e.exec(n);return t&&0===t.index}(t.endRe,a);if(i){if(t["on:end"]){const e=new n(t);t["on:end"](r,e),e.ignore&&(i=!1)}if(i){for(;t.endsParent&&t.parent;)t=t.parent;return t}}if(t.endsWithParent)return e(t.parent,r,a)}(y,e,r);if(!a)return M;var i=y;i.skip?A+=t:(i.returnEnd||i.excludeEnd||(A+=t),u(),i.excludeEnd&&(A=t));do{y.className&&O.closeNode(),y.skip||y.subLanguage||(I+=y.relevance),y=y.parent}while(y!==a.parent);return a.starts&&(a.endSameAsBegin&&(a.starts.endRe=a.endRe),h(a.starts)),i.returnEnd?0:t.length}(r);if(s!==M)return s}if("illegal"===r.type&&""===i)return 1;if(B>1e5&&B>3*r.index)throw Error("potential infinite loop, way more iterations than matches");return A+=i,i.length}var E=T(e);if(!E)throw console.error(g.replace("{}",e)),Error('Unknown language: "'+e+'"');var _=function(e){function n(n,t){return RegExp(d(n),"m"+(e.case_insensitive?"i":"")+(t?"g":""))}class t{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,n){n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]),this.matchAt+=function(e){return RegExp(e.toString()+"|").exec("").length-1}(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const e=this.regexes.map(e=>e[1]);this.matcherRe=n(function(e,n="|"){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i0&&(a+=n),a+="(";o.length>0;){var l=t.exec(o);if(null==l){a+=o;break}a+=o.substring(0,l.index),o=o.substring(l.index+l[0].length),"\\"===l[0][0]&&l[1]?a+="\\"+(+l[1]+s):(a+=l[0],"("===l[0]&&r++)}a+=")"}return a}(e),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;const n=this.matcherRe.exec(e);if(!n)return null;const t=n.findIndex((e,n)=>n>0&&void 0!==e),r=this.matchIndexes[t];return n.splice(0,t),Object.assign(n,r)}}class a{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t;return this.rules.slice(e).forEach(([e,t])=>n.addRule(e,t)),n.compile(),this.multiRegexes[e]=n,n}considerAll(){this.regexIndex=0}addRule(e,n){this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex;const t=n.exec(e);return t&&(this.regexIndex+=t.position+1,this.regexIndex===this.count&&(this.regexIndex=0)),t}}function i(e,n){const t=e.input[e.index-1],r=e.input[e.index+e[0].length];"."!==t&&"."!==r||n.ignoreMatch()}if(e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return function t(s,o){const l=s;if(s.compiled)return l;s.compiled=!0,s.__beforeBegin=null,s.keywords=s.keywords||s.beginKeywords;let c=null;if("object"==typeof s.keywords&&(c=s.keywords.$pattern,delete s.keywords.$pattern),s.keywords&&(s.keywords=function(e,n){var t={};return"string"==typeof e?r("keyword",e):Object.keys(e).forEach((function(n){r(n,e[n])})),t;function r(e,r){n&&(r=r.toLowerCase()),r.split(" ").forEach((function(n){var r=n.split("|");t[r[0]]=[e,w(r[0],r[1])]}))}}(s.keywords,e.case_insensitive)),s.lexemes&&c)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return l.keywordPatternRe=n(s.lexemes||c||/\w+/,!0),o&&(s.beginKeywords&&(s.begin="\\b("+s.beginKeywords.split(" ").join("|")+")(?=\\b|\\s)",s.__beforeBegin=i),s.begin||(s.begin=/\B|\b/),l.beginRe=n(s.begin),s.endSameAsBegin&&(s.end=s.begin),s.end||s.endsWithParent||(s.end=/\B|\b/),s.end&&(l.endRe=n(s.end)),l.terminator_end=d(s.end)||"",s.endsWithParent&&o.terminator_end&&(l.terminator_end+=(s.end?"|":"")+o.terminator_end)),s.illegal&&(l.illegalRe=n(s.illegal)),void 0===s.relevance&&(s.relevance=1),s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((function(e){return function(e){return e.variants&&!e.cached_variants&&(e.cached_variants=e.variants.map((function(n){return r(e,{variants:null},n)}))),e.cached_variants?e.cached_variants:function e(n){return!!n&&(n.endsWithParent||e(n.starts))}(e)?r(e,{starts:e.starts?r(e.starts):null}):Object.isFrozen(e)?r(e):e}("self"===e?s:e)}))),s.contains.forEach((function(e){t(e,l)})),s.starts&&t(s.starts,o),l.matcher=function(e){const n=new a;return e.contains.forEach(e=>n.addRule(e.begin,{rule:e,type:"begin"})),e.terminator_end&&n.addRule(e.terminator_end,{type:"end"}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n}(l),l}(e)}(E),N="",y=s||_,k={},O=new f.__emitter(f);!function(){for(var e=[],n=y;n!==E;n=n.parent)n.className&&e.unshift(n.className);e.forEach(e=>O.openNode(e))}();var A="",I=0,S=0,B=0,L=!1;try{for(y.matcher.considerAll();;){B++,L?L=!1:(y.matcher.lastIndex=S,y.matcher.considerAll());const e=y.matcher.exec(o);if(!e)break;const n=x(o.substring(S,e.index),e);S=e.index+n}return x(o.substr(S)),O.closeAllNodes(),O.finalize(),N=O.toHTML(),{relevance:I,value:N,language:e,illegal:!1,emitter:O,top:y}}catch(n){if(n.message&&n.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:n.message,context:o.slice(S-100,S+100),mode:n.mode},sofar:N,relevance:0,value:R(o),emitter:O};if(l)return{illegal:!1,relevance:0,value:R(o),emitter:O,language:e,top:y,errorRaised:n};throw n}}function v(e,n){n=n||f.languages||Object.keys(i);var t=function(e){const n={relevance:0,emitter:new f.__emitter(f),value:R(e),illegal:!1,top:h};return n.emitter.addText(e),n}(e),r=t;return n.filter(T).filter(I).forEach((function(n){var a=m(n,e,!1);a.language=n,a.relevance>r.relevance&&(r=a),a.relevance>t.relevance&&(r=t,t=a)})),r.language&&(t.second_best=r),t}function x(e){return f.tabReplace||f.useBR?e.replace(c,e=>"\n"===e?f.useBR?"
":e:f.tabReplace?e.replace(/\t/g,f.tabReplace):e):e}function E(e){let n=null;const t=function(e){var n=e.className+" ";n+=e.parentNode?e.parentNode.className:"";const t=f.languageDetectRe.exec(n);if(t){var r=T(t[1]);return r||(console.warn(g.replace("{}",t[1])),console.warn("Falling back to no-highlight mode for this block.",e)),r?t[1]:"no-highlight"}return n.split(/\s+/).find(e=>p(e)||T(e))}(e);if(p(t))return;S("before:highlightBlock",{block:e,language:t}),f.useBR?(n=document.createElement("div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n"):n=e;const r=n.textContent,a=t?b(t,r,!0):v(r),i=k(n);if(i.length){const e=document.createElement("div");e.innerHTML=a.value,a.value=O(i,k(e),r)}a.value=x(a.value),S("after:highlightBlock",{block:e,result:a}),e.innerHTML=a.value,e.className=function(e,n,t){var r=n?s[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),e.includes(r)||a.push(r),a.join(" ").trim()}(e.className,t,a.language),e.result={language:a.language,re:a.relevance,relavance:a.relevance},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.relevance,relavance:a.second_best.relevance})}const N=()=>{if(!N.called){N.called=!0;var e=document.querySelectorAll("pre code");a.forEach.call(e,E)}};function T(e){return e=(e||"").toLowerCase(),i[e]||i[s[e]]}function A(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach(e=>{s[e]=n})}function I(e){var n=T(e);return n&&!n.disableAutodetect}function S(e,n){var t=e;o.forEach((function(e){e[t]&&e[t](n)}))}Object.assign(t,{highlight:b,highlightAuto:v,fixMarkup:x,highlightBlock:E,configure:function(e){f=y(f,e)},initHighlighting:N,initHighlightingOnLoad:function(){window.addEventListener("DOMContentLoaded",N,!1)},registerLanguage:function(e,n){var r=null;try{r=n(t)}catch(n){if(console.error("Language definition for '{}' could not be registered.".replace("{}",e)),!l)throw n;console.error(n),r=h}r.name||(r.name=e),i[e]=r,r.rawDefinition=n.bind(null,t),r.aliases&&A(r.aliases,{languageName:e})},listLanguages:function(){return Object.keys(i)},getLanguage:T,registerAliases:A,requireLanguage:function(e){var n=T(e);if(n)return n;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))},autoDetection:I,inherit:y,addPlugin:function(e){o.push(e)}}),t.debugMode=function(){l=!1},t.safeMode=function(){l=!0},t.versionString="10.1.1";for(const n in _)"object"==typeof _[n]&&e(_[n]);return Object.assign(t,_),t}({})}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs); +hljs.registerLanguage("apache",function(){"use strict";return function(e){var n={className:"number",begin:"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?"};return{name:"Apache config",aliases:["apacheconf"],case_insensitive:!0,contains:[e.HASH_COMMENT_MODE,{className:"section",begin:"",contains:[n,{className:"number",begin:":\\d{1,5}"},e.inherit(e.QUOTE_STRING_MODE,{relevance:0})]},{className:"attribute",begin:/\w+/,relevance:0,keywords:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{end:/$/,relevance:0,keywords:{literal:"on off all deny allow"},contains:[{className:"meta",begin:"\\s\\[",end:"\\]$"},{className:"variable",begin:"[\\$%]\\{",end:"\\}",contains:["self",{className:"number",begin:"[\\$%]\\d+"}]},n,{className:"number",begin:"\\d+"},e.QUOTE_STRING_MODE]}}],illegal:/\S/}}}()); +hljs.registerLanguage("bash",function(){"use strict";return function(e){const s={};Object.assign(s,{className:"variable",variants:[{begin:/\$[\w\d#@][\w\d_]*/},{begin:/\$\{/,end:/\}/,contains:[{begin:/:-/,contains:[s]}]}]});const t={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,t]};t.contains.push(n);const a={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,s]},i=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10}),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b-?[a-z\._]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},contains:[i,e.SHEBANG(),c,a,e.HASH_COMMENT_MODE,n,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},s]}}}()); +hljs.registerLanguage("c-like",function(){"use strict";return function(e){function t(e){return"(?:"+e+")?"}var n="(decltype\\(auto\\)|"+t("[a-zA-Z_]\\w*::")+"[a-zA-Z_]\\w*"+t("<.*?>")+")",r={className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},a={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},i={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(a,{className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},o={className:"title",begin:t("[a-zA-Z_]\\w*::")+e.IDENT_RE,relevance:0},c=t("[a-zA-Z_]\\w*::")+e.IDENT_RE+"\\s*\\(",l={keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary",literal:"true false nullptr NULL"},d=[r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,i,a],_={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:l,contains:d.concat([{begin:/\(/,end:/\)/,keywords:l,contains:d.concat(["self"]),relevance:0}]),relevance:0},u={className:"function",begin:"("+n+"[\\*&\\s]+)+"+c,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:l,illegal:/[^\w\s\*&:<>]/,contains:[{begin:"decltype\\(auto\\)",keywords:l,relevance:0},{begin:c,returnBegin:!0,contains:[o],relevance:0},{className:"params",begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r,{begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:["self",e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r]}]},r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s]};return{aliases:["c","cc","h","c++","h++","hpp","hh","hxx","cxx"],keywords:l,disableAutodetect:!0,illegal:"",keywords:l,contains:["self",r]},{begin:e.IDENT_RE+"::",keywords:l},{className:"class",beginKeywords:"class struct",end:/[{;:]/,contains:[{begin://,contains:["self"]},e.TITLE_MODE]}]),exports:{preprocessor:s,strings:a,keywords:l}}}}()); +hljs.registerLanguage("c",function(){"use strict";return function(e){var n=e.getLanguage("c-like").rawDefinition();return n.name="C",n.aliases=["c","h"],n}}()); +hljs.registerLanguage("coffeescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={keyword:e.concat(["then","unless","until","loop","by","when","and","or","is","isnt","not"]).filter((e=>n=>!e.includes(n))(["var","const","let","function","static"])).join(" "),literal:n.concat(["yes","no","on","off"]).join(" "),built_in:a.concat(["npm","print"]).join(" ")},i="[A-Za-z$_][0-9A-Za-z$_]*",s={className:"subst",begin:/#\{/,end:/}/,keywords:t},o=[r.BINARY_NUMBER_MODE,r.inherit(r.C_NUMBER_MODE,{starts:{end:"(\\s*/)?",relevance:0}}),{className:"string",variants:[{begin:/'''/,end:/'''/,contains:[r.BACKSLASH_ESCAPE]},{begin:/'/,end:/'/,contains:[r.BACKSLASH_ESCAPE]},{begin:/"""/,end:/"""/,contains:[r.BACKSLASH_ESCAPE,s]},{begin:/"/,end:/"/,contains:[r.BACKSLASH_ESCAPE,s]}]},{className:"regexp",variants:[{begin:"///",end:"///",contains:[s,r.HASH_COMMENT_MODE]},{begin:"//[gim]{0,3}(?=\\W)",relevance:0},{begin:/\/(?![ *]).*?(?![\\]).\/[gim]{0,3}(?=\W)/}]},{begin:"@"+i},{subLanguage:"javascript",excludeBegin:!0,excludeEnd:!0,variants:[{begin:"```",end:"```"},{begin:"`",end:"`"}]}];s.contains=o;var c=r.inherit(r.TITLE_MODE,{begin:i}),l={className:"params",begin:"\\([^\\(]",returnBegin:!0,contains:[{begin:/\(/,end:/\)/,keywords:t,contains:["self"].concat(o)}]};return{name:"CoffeeScript",aliases:["coffee","cson","iced"],keywords:t,illegal:/\/\*/,contains:o.concat([r.COMMENT("###","###"),r.HASH_COMMENT_MODE,{className:"function",begin:"^\\s*"+i+"\\s*=\\s*(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[c,l]},{begin:/[:\(,=]\s*/,relevance:0,contains:[{className:"function",begin:"(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[l]}]},{className:"class",beginKeywords:"class",end:"$",illegal:/[:="\[\]]/,contains:[{beginKeywords:"extends",endsWithParent:!0,illegal:/[:="\[\]]/,contains:[c]},c]},{begin:i+":",end:":",returnBegin:!0,returnEnd:!0,relevance:0}])}}}()); +hljs.registerLanguage("cpp",function(){"use strict";return function(e){var t=e.getLanguage("c-like").rawDefinition();return t.disableAutodetect=!1,t.name="C++",t.aliases=["cc","c++","h++","hpp","hh","hxx","cxx"],t}}()); +hljs.registerLanguage("csharp",function(){"use strict";return function(e){var n={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let nameof on orderby partial remove select set value var when where yield",literal:"null false true"},i=e.inherit(e.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},t=e.inherit(s,{illegal:/\n/}),l={className:"subst",begin:"{",end:"}",keywords:n},r=e.inherit(l,{illegal:/\n/}),c={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},e.BACKSLASH_ESCAPE,r]},o={className:"string",begin:/\$@"/,end:'"',contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},l]},g=e.inherit(o,{illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},r]});l.contains=[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE],r.contains=[g,c,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];var d={variants:[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},E={begin:"<",end:">",contains:[{beginKeywords:"in out"},i]},_=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",b={begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:"\x3c!--|--\x3e"},{begin:""}]}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},d,a,{beginKeywords:"class interface",end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},i,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",end:/[{;=]/,illegal:/[^\s:]/,contains:[i,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"meta-string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+_+"\\s+)+"+e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{begin:e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,contains:[e.TITLE_MODE,E],relevance:0},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0,contains:[d,a,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},b]}}}()); +hljs.registerLanguage("css",function(){"use strict";return function(e){var n={begin:/(?:[A-Z\_\.\-]+|--[a-zA-Z0-9_-]+)\s*:/,returnBegin:!0,end:";",endsWithParent:!0,contains:[{className:"attribute",begin:/\S/,end:":",excludeEnd:!0,starts:{endsWithParent:!0,excludeEnd:!0,contains:[{begin:/[\w-]+\(/,returnBegin:!0,contains:[{className:"built_in",begin:/[\w-]+/},{begin:/\(/,end:/\)/,contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{className:"number",begin:"#[0-9A-Fa-f]+"},{className:"meta",begin:"!important"}]}}]};return{name:"CSS",case_insensitive:!0,illegal:/[=\/|'\$]/,contains:[e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/},{className:"selector-class",begin:/\.[A-Za-z0-9_-]+/},{className:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",illegal:/:/,returnBegin:!0,contains:[{className:"keyword",begin:/@\-?\w[\w]*(\-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:"and or not only",contains:[{begin:/[a-z-]+:/,className:"attribute"},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0},{begin:"{",end:"}",illegal:/\S/,contains:[e.C_BLOCK_COMMENT_MODE,n]}]}}}()); +hljs.registerLanguage("diff",function(){"use strict";return function(e){return{name:"Diff",aliases:["patch"],contains:[{className:"meta",relevance:10,variants:[{begin:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{begin:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{begin:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{className:"comment",variants:[{begin:/Index: /,end:/$/},{begin:/={3,}/,end:/$/},{begin:/^\-{3}/,end:/$/},{begin:/^\*{3} /,end:/$/},{begin:/^\+{3}/,end:/$/},{begin:/^\*{15}$/}]},{className:"addition",begin:"^\\+",end:"$"},{className:"deletion",begin:"^\\-",end:"$"},{className:"addition",begin:"^\\!",end:"$"}]}}}()); +hljs.registerLanguage("go",function(){"use strict";return function(e){var n={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{name:"Go",aliases:["golang"],keywords:n,illegal:"e(n)).join("")}return function(a){var s={className:"number",relevance:0,variants:[{begin:/([\+\-]+)?[\d]+_[\d_]+/},{begin:a.NUMBER_RE}]},i=a.COMMENT();i.variants=[{begin:/;/,end:/$/},{begin:/#/,end:/$/}];var t={className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)}/}]},r={className:"literal",begin:/\bon|off|true|false|yes|no\b/},l={className:"string",contains:[a.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}]},c={begin:/\[/,end:/\]/,contains:[i,r,t,l,s,"self"],relevance:0},g="("+[/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/].map(n=>e(n)).join("|")+")";return{name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/,contains:[i,{className:"section",begin:/\[+/,end:/\]+/},{begin:n(g,"(\\s*\\.\\s*",g,")*",n("(?=",/\s*=\s*[^#\s]/,")")),className:"attr",starts:{end:/$/,contains:[i,c,r,t,l,s]}}]}}}()); +hljs.registerLanguage("java",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(e){return a("(",e,")?")}function a(...n){return n.map(n=>e(n)).join("")}function s(...n){return"("+n.map(n=>e(n)).join("|")+")"}return function(e){var t="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",i={className:"meta",begin:"@[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",contains:[{begin:/\(/,end:/\)/,contains:["self"]}]},r=e=>a("[",e,"]+([",e,"_]*[",e,"]+)?"),c={className:"number",variants:[{begin:`\\b(0[bB]${r("01")})[lL]?`},{begin:`\\b(0${r("0-7")})[dDfFlL]?`},{begin:a(/\b0[xX]/,s(a(r("a-fA-F0-9"),/\./,r("a-fA-F0-9")),a(r("a-fA-F0-9"),/\.?/),a(/\./,r("a-fA-F0-9"))),/([pP][+-]?(\d+))?/,/[fFdDlL]?/)},{begin:a(/\b/,s(a(/\d*\./,r("\\d")),r("\\d")),/[eE][+-]?[\d]+[dDfF]?/)},{begin:a(/\b/,r(/\d/),n(/\.?/),n(r(/\d/)),/[dDfFlL]?/)}],relevance:0};return{name:"Java",aliases:["jsp"],keywords:t,illegal:/<\/|#/,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"class",beginKeywords:"class interface",end:/[{;=]/,excludeEnd:!0,keywords:"class interface",illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"new throw return else",relevance:0},{className:"function",begin:"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\s*,\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\s+)+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:t,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/,keywords:t,relevance:0,contains:[i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},c,i]}}}()); +hljs.registerLanguage("javascript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);function s(e){return r("(?=",e,")")}function r(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(t){var i="[A-Za-z$_][0-9A-Za-z$_]*",c={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/},o={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.join(" "),literal:n.join(" "),built_in:a.join(" ")},l={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:t.C_NUMBER_RE+"n?"}],relevance:0},E={className:"subst",begin:"\\$\\{",end:"\\}",keywords:o,contains:[]},d={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"xml"}},g={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"css"}},u={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,E]};E.contains=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,l,t.REGEXP_MODE];var b=E.contains.concat([{begin:/\(/,end:/\)/,contains:["self"].concat(E.contains,[t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE])},t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]),_={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:b};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:o,contains:[t.SHEBANG({binary:"node",relevance:5}),{className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,t.C_LINE_COMMENT_MODE,t.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+",contains:[{className:"type",begin:"\\{",end:"\\}",relevance:0},{className:"variable",begin:i+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,l,{begin:r(/[{,\n]\s*/,s(r(/(((\/\/.*)|(\/\*(.|\n)*\*\/))\s*)*/,i+"\\s*:"))),relevance:0,contains:[{className:"attr",begin:i+s("\\s*:"),relevance:0}]},{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,t.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:o,contains:b}]}]},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:"<>",end:""},{begin:c.begin,end:c.end}],subLanguage:"xml",contains:[{begin:c.begin,end:c.end,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[t.inherit(t.TITLE_MODE,{begin:i}),_],illegal:/\[|%/},{begin:/\$[(.]/},t.METHOD_GUARD,{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends"},t.UNDERSCORE_TITLE_MODE]},{beginKeywords:"constructor",end:/\{/,excludeEnd:!0},{begin:"(get|set)\\s+(?="+i+"\\()",end:/{/,keywords:"get set",contains:[t.inherit(t.TITLE_MODE,{begin:i}),{begin:/\(\)/},_]}],illegal:/#(?!!)/}}}()); +hljs.registerLanguage("json",function(){"use strict";return function(n){var e={literal:"true false null"},i=[n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],t=[n.QUOTE_STRING_MODE,n.C_NUMBER_MODE],a={end:",",endsWithParent:!0,excludeEnd:!0,contains:t,keywords:e},l={begin:"{",end:"}",contains:[{className:"attr",begin:/"/,end:/"/,contains:[n.BACKSLASH_ESCAPE],illegal:"\\n"},n.inherit(a,{begin:/:/})].concat(i),illegal:"\\S"},s={begin:"\\[",end:"\\]",contains:[n.inherit(a)],illegal:"\\S"};return t.push(l,s),i.forEach((function(n){t.push(n)})),{name:"JSON",contains:t,keywords:e,illegal:"\\S"}}}()); +hljs.registerLanguage("kotlin",function(){"use strict";return function(e){var n={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual trait volatile transient native default",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},a={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@"},i={className:"subst",begin:"\\${",end:"}",contains:[e.C_NUMBER_MODE]},s={className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},t={className:"string",variants:[{begin:'"""',end:'"""(?=[^"])',contains:[s,i]},{begin:"'",end:"'",illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,s,i]}]};i.contains.push(t);var r={className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?"},l={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[e.inherit(t,{className:"meta-string"})]}]},c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),o={variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,contains:[]}]},d=o;return d.variants[1].contains=[o],o.variants[1].contains=[d],{name:"Kotlin",aliases:["kt"],keywords:n,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,c,{className:"keyword",begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",begin:/@\w+/}]}},a,r,l,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:n,illegal:/fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/,relevance:5,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,endsWithParent:!0,contains:[o,e.C_LINE_COMMENT_MODE,c],relevance:0},e.C_LINE_COMMENT_MODE,c,r,l,t,e.C_NUMBER_MODE]},c]},{className:"class",beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/,excludeBegin:!0,returnEnd:!0},r,l]},t,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:"\n"},{className:"number",begin:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",relevance:0}]}}}()); +hljs.registerLanguage("less",function(){"use strict";return function(e){var n="([\\w-]+|@{[\\w-]+})",a=[],s=[],t=function(e){return{className:"string",begin:"~?"+e+".*?"+e}},r=function(e,n,a){return{className:e,begin:n,relevance:a}},i={begin:"\\(",end:"\\)",contains:s,relevance:0};s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t("'"),t('"'),e.CSS_NUMBER_MODE,{begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",excludeEnd:!0}},r("number","#[0-9A-Fa-f]+\\b"),i,r("variable","@@?[\\w-]+",10),r("variable","@{[\\w-]+}"),r("built_in","~?`[^`]*?`"),{className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0},{className:"meta",begin:"!important"});var c=s.concat({begin:"{",end:"}",contains:a}),l={beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"}].concat(s)},o={begin:n+"\\s*:",returnBegin:!0,end:"[;}]",relevance:0,contains:[{className:"attribute",begin:n,end:":",excludeEnd:!0,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:s}}]},g={className:"keyword",begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{end:"[;{}]",returnEnd:!0,contains:s,relevance:0}},d={className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{begin:"@[\\w-]+"}],starts:{end:"[;}]",returnEnd:!0,contains:c}},b={variants:[{begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:n,end:"{"}],returnBegin:!0,returnEnd:!0,illegal:"[<='$\"]",relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,l,r("keyword","all\\b"),r("variable","@{[\\w-]+}"),r("selector-tag",n+"%?",0),r("selector-id","#"+n),r("selector-class","\\."+n,0),r("selector-tag","&",0),{className:"selector-attr",begin:"\\[",end:"\\]"},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"\\(",end:"\\)",contains:c},{begin:"!important"}]};return a.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,g,d,o,b),{name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:a}}}()); +hljs.registerLanguage("lua",function(){"use strict";return function(e){var t={begin:"\\[=*\\[",end:"\\]=*\\]",contains:["self"]},a=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[","\\]=*\\]",{contains:[t],relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE,literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},contains:a.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[e.inherit(e.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:a}].concat(a)},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string",begin:"\\[=*\\[",end:"\\]=*\\]",contains:[t],relevance:5}])}}}()); +hljs.registerLanguage("makefile",function(){"use strict";return function(e){var i={className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin:"",relevance:10,contains:[a,i,t,s,{begin:"\\[",end:"\\]",contains:[{className:"meta",begin:"",contains:[a,s,i,t]}]}]},e.COMMENT("\x3c!--","--\x3e",{relevance:10}),{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},n,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:")",end:">",keywords:{name:"style"},contains:[c],starts:{end:"",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:")",end:">",keywords:{name:"script"},contains:[c],starts:{end:"<\/script>",returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:"",contains:[{className:"name",begin:/[^\/><\s]+/,relevance:0},c]}]}}}()); +hljs.registerLanguage("markdown",function(){"use strict";return function(n){const e={begin:"<",end:">",subLanguage:"xml",relevance:0},a={begin:"\\[.+?\\][\\(\\[].*?[\\)\\]]",returnBegin:!0,contains:[{className:"string",begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0,relevance:0},{className:"link",begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}],relevance:10},i={className:"strong",contains:[],variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},s={className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{begin:/_(?!_)/,end:/_/,relevance:0}]};i.contains.push(s),s.contains.push(i);var c=[e,a];return i.contains=i.contains.concat(c),s.contains=s.contains.concat(c),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:c=c.concat(i,s)},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:c}]}]},e,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},i,s,{className:"quote",begin:"^>\\s+",contains:c,end:"$"},{className:"code",variants:[{begin:"(`{3,})(.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})(.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{begin:"^[-\\*]{3,}",end:"$"},a,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}}()); +hljs.registerLanguage("nginx",function(){"use strict";return function(e){var n={className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{/,end:/}/},{begin:"[\\$\\@]"+e.UNDERSCORE_IDENT_RE}]},a={endsWithParent:!0,keywords:{$pattern:"[a-z/_]+",literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},relevance:0,illegal:"=>",contains:[e.HASH_COMMENT_MODE,{className:"string",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[n]},{className:"regexp",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:"\\s\\^",end:"\\s|{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|{|;",returnEnd:!0},{begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number",begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{className:"number",begin:"\\b\\d+[kKmMgGdshdwy]*\\b",relevance:0},n]};return{name:"Nginx config",aliases:["nginxconf"],contains:[e.HASH_COMMENT_MODE,{begin:e.UNDERSCORE_IDENT_RE+"\\s+{",returnBegin:!0,end:"{",contains:[{className:"section",begin:e.UNDERSCORE_IDENT_RE}],relevance:0},{begin:e.UNDERSCORE_IDENT_RE+"\\s",end:";|{",returnBegin:!0,contains:[{className:"attribute",begin:e.UNDERSCORE_IDENT_RE,starts:a}],relevance:0}],illegal:"[^\\s\\}]"}}}()); +hljs.registerLanguage("objectivec",function(){"use strict";return function(e){var n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={$pattern:n,keyword:"@interface @class @protocol @implementation"};return{name:"Objective-C",aliases:["mm","objc","obj-c"],keywords:{$pattern:n,keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},illegal:"/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class",begin:"("+_.keyword.split(" ").join("|")+")\\b",end:"({|$)",excludeEnd:!0,keywords:_,contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}}()); +hljs.registerLanguage("perl",function(){"use strict";return function(e){var n={$pattern:/[\w.]+/,keyword:"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qq fileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmget sub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedir ioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when"},t={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:n},s={begin:"->{",end:"}"},r={variants:[{begin:/\$\d/},{begin:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{begin:/[\$%@][^\s\w{]/,relevance:0}]},i=[e.BACKSLASH_ESCAPE,t,r],a=[r,e.HASH_COMMENT_MODE,e.COMMENT("^\\=\\w","\\=cut",{endsWithParent:!0}),s,{className:"string",contains:i,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*\\<",end:"\\>",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE]},{begin:"{\\w+}",contains:[],relevance:0},{begin:"-?\\w+\\s*\\=\\>",contains:[],relevance:0}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[e.HASH_COMMENT_MODE,{className:"regexp",begin:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",relevance:10},{className:"regexp",begin:"(m|qr)?/",end:"/[a-z]*",contains:[e.BACKSLASH_ESCAPE],relevance:0}]},{className:"function",beginKeywords:"sub",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return t.contains=a,s.contains=a,{name:"Perl",aliases:["pl","pm"],keywords:n,contains:a}}}()); +hljs.registerLanguage("php",function(){"use strict";return function(e){var r={begin:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},t={className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{begin:/\?>/}]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:'b"',end:'"'},{begin:"b'",end:"'"},e.inherit(e.APOS_STRING_MODE,{illegal:null}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null})]},n={variants:[e.BINARY_NUMBER_MODE,e.C_NUMBER_MODE]},i={keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list new object or private protected public real return string switch throw trait try unset use var void while xor yield",literal:"false null true",built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Throwable Traversable WeakReference Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass"};return{aliases:["php","php3","php4","php5","php6","php7"],case_insensitive:!0,keywords:i,contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t]}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler"}),{className:"string",begin:/<<<['"]?\w+['"]?$/,end:/^\w+;?$/,contains:[e.BACKSLASH_ESCAPE,{className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]}]},t,{className:"keyword",begin:/\$this\b/},r,{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[e.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:i,contains:["self",r,e.C_BLOCK_COMMENT_MODE,a,n]}]},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,illegal:/[:\(\$"]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",end:";",illegal:/[\.']/,contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",end:";",contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"=>"},a,n]}}}()); +hljs.registerLanguage("php-template",function(){"use strict";return function(n){return{name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},n.inherit(n.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),n.inherit(n.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]}]}}}()); +hljs.registerLanguage("plaintext",function(){"use strict";return function(t){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}}()); +hljs.registerLanguage("properties",function(){"use strict";return function(e){var n="[ \\t\\f]*",t="("+n+"[:=]"+n+"|[ \\t\\f]+)",a="([^\\\\:= \\t\\f\\n]|\\\\.)+",s={end:t,relevance:0,starts:{className:"string",end:/$/,relevance:0,contains:[{begin:"\\\\\\n"}]}};return{name:".properties",case_insensitive:!0,illegal:/\S/,contains:[e.COMMENT("^\\s*[!#]","$"),{begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+"+t,returnBegin:!0,contains:[{className:"attr",begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",endsParent:!0,relevance:0}],starts:s},{begin:a+t,returnBegin:!0,relevance:0,contains:[{className:"meta",begin:a,endsParent:!0,relevance:0}],starts:s},{className:"attr",relevance:0,begin:a+n+"$"}]}}}()); +hljs.registerLanguage("python",function(){"use strict";return function(e){var n={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10",built_in:"Ellipsis NotImplemented",literal:"False None True"},a={className:"meta",begin:/^(>>>|\.\.\.) /},i={className:"subst",begin:/\{/,end:/\}/,keywords:n,illegal:/#/},s={begin:/\{\{/,relevance:0},r={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/(u|b)?r?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(u|b)?r?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(fr|rf|f)'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(fr|rf|f)"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(u|r|ur)'/,end:/'/,relevance:10},{begin:/(u|r|ur)"/,end:/"/,relevance:10},{begin:/(b|br)'/,end:/'/},{begin:/(b|br)"/,end:/"/},{begin:/(fr|rf|f)'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,s,i]},{begin:/(fr|rf|f)"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,i]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},l={className:"number",relevance:0,variants:[{begin:e.BINARY_NUMBER_RE+"[lLjJ]?"},{begin:"\\b(0o[0-7]+)[lLjJ]?"},{begin:e.C_NUMBER_RE+"[lLjJ]?"}]},t={className:"params",variants:[{begin:/\(\s*\)/,skip:!0,className:null},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:["self",a,l,r,e.HASH_COMMENT_MODE]}]};return i.contains=[r,l,a],{name:"Python",aliases:["py","gyp","ipython"],keywords:n,illegal:/(<\/|->|\?)|=>/,contains:[a,l,{beginKeywords:"if",relevance:0},r,e.HASH_COMMENT_MODE,{variants:[{className:"function",beginKeywords:"def"},{className:"class",beginKeywords:"class"}],end:/:/,illegal:/[${=;\n,]/,contains:[e.UNDERSCORE_TITLE_MODE,t,{begin:/->/,endsWithParent:!0,keywords:"None"}]},{className:"meta",begin:/^[\t ]*@/,end:/$/},{begin:/\b(print|exec)\(/}]}}}()); +hljs.registerLanguage("python-repl",function(){"use strict";return function(n){return{aliases:["pycon"],contains:[{className:"meta",starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}}}()); +hljs.registerLanguage("ruby",function(){"use strict";return function(e){var n="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",a={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},s={className:"doctag",begin:"@[A-Za-z]+"},i={begin:"#<",end:">"},r=[e.COMMENT("#","$",{contains:[s]}),e.COMMENT("^\\=begin","^\\=end",{contains:[s],relevance:10}),e.COMMENT("^__END__","\\n$")],c={className:"subst",begin:"#\\{",end:"}",keywords:a},t={className:"string",contains:[e.BACKSLASH_ESCAPE,c],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:"%[qQwWx]?\\(",end:"\\)"},{begin:"%[qQwWx]?\\[",end:"\\]"},{begin:"%[qQwWx]?{",end:"}"},{begin:"%[qQwWx]?<",end:">"},{begin:"%[qQwWx]?/",end:"/"},{begin:"%[qQwWx]?%",end:"%"},{begin:"%[qQwWx]?-",end:"-"},{begin:"%[qQwWx]?\\|",end:"\\|"},{begin:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{begin:/<<[-~]?'?(\w+)(?:.|\n)*?\n\s*\1\b/,returnBegin:!0,contains:[{begin:/<<[-~]?'?/},e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[e.BACKSLASH_ESCAPE,c]})]}]},b={className:"params",begin:"\\(",end:"\\)",endsParent:!0,keywords:a},d=[t,i,{className:"class",beginKeywords:"class module",end:"$|;",illegal:/=/,contains:[e.inherit(e.TITLE_MODE,{begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{begin:"<\\s*",contains:[{begin:"("+e.IDENT_RE+"::)?"+e.IDENT_RE}]}].concat(r)},{className:"function",beginKeywords:"def",end:"$|;",contains:[e.inherit(e.TITLE_MODE,{begin:n}),b].concat(r)},{begin:e.IDENT_RE+"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(\\!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[t,{begin:n}],relevance:0},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{className:"params",begin:/\|/,end:/\|/,keywords:a},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[i,{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:"%r{",end:"}[a-z]*"},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(r),relevance:0}].concat(r);c.contains=d,b.contains=d;var g=[{begin:/^\s*=>/,starts:{end:"$",contains:d}},{className:"meta",begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{end:"$",contains:d}}];return{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:a,illegal:/\/\*/,contains:r.concat(g).concat(d)}}}()); +hljs.registerLanguage("rust",function(){"use strict";return function(e){var n="([ui](8|16|32|64|128|size)|f(32|64))?",t="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!";return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",keyword:"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield",literal:"true false Some None Ok Err",built_in:t},illegal:""}]}}}()); +hljs.registerLanguage("scss",function(){"use strict";return function(e){var t={className:"variable",begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"},i={className:"number",begin:"#[0-9A-Fa-f]+"};return e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{name:"SCSS",case_insensitive:!0,illegal:"[=/|']",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:"\\#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},{className:"selector-attr",begin:"\\[",end:"\\]",illegal:"$"},{className:"selector-tag",begin:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",relevance:0},{className:"selector-pseudo",begin:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{className:"selector-pseudo",begin:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},t,{className:"attribute",begin:"\\b(src|z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",illegal:"[^\\s]"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:":",end:";",contains:[t,i,e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"meta",begin:"!important"}]},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",returnBegin:!0,keywords:"and or not only",contains:[{begin:"@[a-z-]+",className:"keyword"},t,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,i,e.CSS_NUMBER_MODE]}]}}}()); +hljs.registerLanguage("shell",function(){"use strict";return function(s){return{name:"Shell Session",aliases:["console"],contains:[{className:"meta",begin:"^\\s{0,3}[/\\w\\d\\[\\]()@-]*[>%$#]",starts:{end:"$",subLanguage:"bash"}}]}}}()); +hljs.registerLanguage("sql",function(){"use strict";return function(e){var t=e.COMMENT("--","$");return{name:"SQL",case_insensitive:!0,illegal:/[<>{}*]/,contains:[{beginKeywords:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with",end:/;/,endsWithParent:!0,keywords:{$pattern:/[\w\.]+/,keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void"},contains:[{className:"string",begin:"'",end:"'",contains:[{begin:"''"}]},{className:"string",begin:'"',end:'"',contains:[{begin:'""'}]},{className:"string",begin:"`",end:"`"},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]},e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]}}}()); +hljs.registerLanguage("swift",function(){"use strict";return function(e){var i={keyword:"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c compactMap contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},n=e.COMMENT("/\\*","\\*/",{contains:["self"]}),t={className:"subst",begin:/\\\(/,end:"\\)",keywords:i,contains:[]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:/"""/,end:/"""/},{begin:/"/,end:/"/}]},r={className:"number",begin:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",relevance:0};return t.contains=[r],{name:"Swift",keywords:i,contains:[a,e.C_LINE_COMMENT_MODE,n,{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*[!?]"},{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*",relevance:0},r,{className:"function",beginKeywords:"func",end:"{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][0-9A-Za-z$_]*/}),{begin://},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:i,contains:["self",r,a,e.C_BLOCK_COMMENT_MODE,{begin:":"}],illegal:/["']/}],illegal:/\[|%/},{className:"class",beginKeywords:"struct protocol class extension enum",keywords:i,end:"\\{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{className:"meta",begin:"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|@propertyWrapper)\\b"},{beginKeywords:"import",end:/$/,contains:[e.C_LINE_COMMENT_MODE,n]}]}}}()); +hljs.registerLanguage("typescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.concat(["type","namespace","typedef","interface","public","private","protected","implements","declare","abstract","readonly"]).join(" "),literal:n.join(" "),built_in:a.concat(["any","void","number","boolean","string","object","never","enum"]).join(" ")},s={className:"meta",begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},i={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:r.C_NUMBER_RE+"n?"}],relevance:0},o={className:"subst",begin:"\\$\\{",end:"\\}",keywords:t,contains:[]},c={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"xml"}},l={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"css"}},E={className:"string",begin:"`",end:"`",contains:[r.BACKSLASH_ESCAPE,o]};o.contains=[r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,i,r.REGEXP_MODE];var d={begin:"\\(",end:/\)/,keywords:t,contains:["self",r.QUOTE_STRING_MODE,r.APOS_STRING_MODE,r.NUMBER_MODE]},u={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,s,d]};return{name:"TypeScript",aliases:["ts"],keywords:t,contains:[r.SHEBANG(),{className:"meta",begin:/^\s*['"]use strict['"]/},r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,i,{begin:"("+r.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,r.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+r.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:r.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:d.contains}]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/[\{;]/,excludeEnd:!0,keywords:t,contains:["self",r.inherit(r.TITLE_MODE,{begin:"[A-Za-z$_][0-9A-Za-z$_]*"}),u],illegal:/%/,relevance:0},{beginKeywords:"constructor",end:/[\{;]/,excludeEnd:!0,contains:["self",u]},{begin:/module\./,keywords:{built_in:"module"},relevance:0},{beginKeywords:"module",end:/\{/,excludeEnd:!0},{beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:"interface extends"},{begin:/\$[(.]/},{begin:"\\."+r.IDENT_RE,relevance:0},s,d]}}}()); +hljs.registerLanguage("yaml",function(){"use strict";return function(e){var n="true false yes no null",a="[\\w#;/?:@&=+$,.~*\\'()[\\]]+",s={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:"{{",end:"}}"},{begin:"%{",end:"}"}]}]},i=e.inherit(s,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l={end:",",endsWithParent:!0,excludeEnd:!0,contains:[],keywords:n,relevance:0},t={begin:"{",end:"}",contains:[l],illegal:"\\n",relevance:0},g={begin:"\\[",end:"\\]",contains:[l],illegal:"\\n",relevance:0},b=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---s*$",relevance:10},{className:"string",begin:"[\\|>]([0-9]?[+-])?[ ]*\\n( *)[\\S ]+\\n(\\2[\\S ]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type",begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"\\-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},{className:"number",begin:e.C_NUMBER_RE+"\\b"},t,g,s],c=[...b];return c.pop(),c.push(i),l.contains=c,{name:"YAML",case_insensitive:!0,aliases:["yml","YAML"],contains:b}}}()); +hljs.registerLanguage("armasm",function(){"use strict";return function(s){const e={variants:[s.COMMENT("^[ \\t]*(?=#)","$",{relevance:0,excludeBegin:!0}),s.COMMENT("[;@]","$",{relevance:0}),s.C_LINE_COMMENT_MODE,s.C_BLOCK_COMMENT_MODE]};return{name:"ARM Assembly",case_insensitive:!0,aliases:["arm"],keywords:{$pattern:"\\.?"+s.IDENT_RE,meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND ",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @"},contains:[{className:"keyword",begin:"\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?(?=\\s)"},e,s.QUOTE_STRING_MODE,{className:"string",begin:"'",end:"[^\\\\]'",relevance:0},{className:"title",begin:"\\|",end:"\\|",illegal:"\\n",relevance:0},{className:"number",variants:[{begin:"[#$=]?0x[0-9a-f]+"},{begin:"[#$=]?0b[01]+"},{begin:"[#$=]\\d+"},{begin:"\\b\\d+"}],relevance:0},{className:"symbol",variants:[{begin:"^[ \\t]*[a-z_\\.\\$][a-z0-9_\\.\\$]+:"},{begin:"^[a-z_\\.\\$][a-z0-9_\\.\\$]+"},{begin:"[=#]\\w+"}],relevance:0}]}}}()); +hljs.registerLanguage("d",function(){"use strict";return function(e){var a={$pattern:e.UNDERSCORE_IDENT_RE,keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"},d="((0|[1-9][\\d_]*)|0[bB][01_]+|0[xX]([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))",n="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};",t={className:"number",begin:"\\b"+d+"(L|u|U|Lu|LU|uL|UL)?",relevance:0},_={className:"number",begin:"\\b(((0[xX](([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)\\.([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)|\\.?([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))[pP][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))|((0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(\\.\\d*|([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)))|\\d+\\.(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)|\\.(0|[1-9][\\d_]*)([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))?))([fF]|L|i|[fF]i|Li)?|"+d+"(i|[fF]i|Li))",relevance:0},r={className:"string",begin:"'("+n+"|.)",end:"'",illegal:"."},i={className:"string",begin:'"',contains:[{begin:n,relevance:0}],end:'"[cwd]?'},s=e.COMMENT("\\/\\+","\\+\\/",{contains:["self"],relevance:10});return{name:"D",keywords:a,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s,{className:"string",begin:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',relevance:10},i,{className:"string",begin:'[rq]"',end:'"[cwd]?',relevance:5},{className:"string",begin:"`",end:"`[cwd]?"},{className:"string",begin:'q"\\{',end:'\\}"'},_,t,r,{className:"meta",begin:"^#!",end:"$",relevance:5},{className:"meta",begin:"#(line)",end:"$",relevance:5},{className:"keyword",begin:"@[a-zA-Z_][a-zA-Z_\\d]*"}]}}}()); +hljs.registerLanguage("handlebars",function(){"use strict";function e(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(n){const a={"builtin-name":"action bindattr collection component concat debugger each each-in get hash if in input link-to loc log lookup mut outlet partial query-params render template textarea unbound unless view with yield"},t=/\[.*?\]/,s=/[^\s!"#%&'()*+,.\/;<=>@\[\\\]^`{|}~]+/,i=e("(",/'.*?'/,"|",/".*?"/,"|",t,"|",s,"|",/\.|\//,")+"),r=e("(",t,"|",s,")(?==)"),l={begin:i,lexemes:/[\w.\/]+/},c=n.inherit(l,{keywords:{literal:"true false undefined null"}}),o={begin:/\(/,end:/\)/},m={className:"attr",begin:r,relevance:0,starts:{begin:/=/,end:/=/,starts:{contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,c,o]}}},d={contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,{begin:/as\s+\|/,keywords:{keyword:"as"},end:/\|/,contains:[{begin:/\w+/}]},m,c,o],returnEnd:!0},g=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/\)/})});o.contains=[g];const u=n.inherit(l,{keywords:a,className:"name",starts:n.inherit(d,{end:/}}/})}),b=n.inherit(l,{keywords:a,className:"name"}),h=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/}}/})});return{name:"Handlebars",aliases:["hbs","html.hbs","html.handlebars","htmlbars"],case_insensitive:!0,subLanguage:"xml",contains:[{begin:/\\\{\{/,skip:!0},{begin:/\\\\(?=\{\{)/,skip:!0},n.COMMENT(/\{\{!--/,/--\}\}/),n.COMMENT(/\{\{!/,/\}\}/),{className:"template-tag",begin:/\{\{\{\{(?!\/)/,end:/\}\}\}\}/,contains:[u],starts:{end:/\{\{\{\{\//,returnEnd:!0,subLanguage:"xml"}},{className:"template-tag",begin:/\{\{\{\{\//,end:/\}\}\}\}/,contains:[b]},{className:"template-tag",begin:/\{\{#/,end:/\}\}/,contains:[u]},{className:"template-tag",begin:/\{\{(?=else\}\})/,end:/\}\}/,keywords:"else"},{className:"template-tag",begin:/\{\{\//,end:/\}\}/,contains:[b]},{className:"template-variable",begin:/\{\{\{/,end:/\}\}\}/,contains:[h]},{className:"template-variable",begin:/\{\{/,end:/\}\}/,contains:[h]}]}}}()); +hljs.registerLanguage("haskell",function(){"use strict";return function(e){var n={variants:[e.COMMENT("--","$"),e.COMMENT("{-","-}",{contains:["self"]})]},i={className:"meta",begin:"{-#",end:"#-}"},a={className:"meta",begin:"^#",end:"$"},s={className:"type",begin:"\\b[A-Z][\\w']*",relevance:0},l={begin:"\\(",end:"\\)",illegal:'"',contains:[i,a,{className:"type",begin:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},e.inherit(e.TITLE_MODE,{begin:"[_a-z][\\w']*"}),n]};return{name:"Haskell",aliases:["hs"],keywords:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",contains:[{beginKeywords:"module",end:"where",keywords:"module where",contains:[l,n],illegal:"\\W\\.|;"},{begin:"\\bimport\\b",end:"$",keywords:"import qualified as hiding",contains:[l,n],illegal:"\\W\\.|;"},{className:"class",begin:"^(\\s*)?(class|instance)\\b",end:"where",keywords:"class family instance where",contains:[s,l,n]},{className:"class",begin:"\\b(data|(new)?type)\\b",end:"$",keywords:"data family type newtype deriving",contains:[i,s,l,{begin:"{",end:"}",contains:l.contains},n]},{beginKeywords:"default",end:"$",contains:[s,l,n]},{beginKeywords:"infix infixl infixr",end:"$",contains:[e.C_NUMBER_MODE,n]},{begin:"\\bforeign\\b",end:"$",keywords:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",contains:[s,e.QUOTE_STRING_MODE,n]},{className:"meta",begin:"#!\\/usr\\/bin\\/env runhaskell",end:"$"},i,a,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,s,e.inherit(e.TITLE_MODE,{begin:"^[_a-z][\\w']*"}),n,{begin:"->|<-"}]}}}()); +hljs.registerLanguage("julia",function(){"use strict";return function(e){var r="[A-Za-z_\\u00A1-\\uFFFF][A-Za-z_0-9\\u00A1-\\uFFFF]*",t={$pattern:r,keyword:"in isa where baremodule begin break catch ccall const continue do else elseif end export false finally for function global if import importall let local macro module quote return true try using while type immutable abstract bitstype typealias ",literal:"true false ARGS C_NULL DevNull ENDIAN_BOM ENV I Inf Inf16 Inf32 Inf64 InsertionSort JULIA_HOME LOAD_PATH MergeSort NaN NaN16 NaN32 NaN64 PROGRAM_FILE QuickSort RoundDown RoundFromZero RoundNearest RoundNearestTiesAway RoundNearestTiesUp RoundToZero RoundUp STDERR STDIN STDOUT VERSION catalan e|0 eu|0 eulergamma golden im nothing pi γ π φ ",built_in:"ANY AbstractArray AbstractChannel AbstractFloat AbstractMatrix AbstractRNG AbstractSerializer AbstractSet AbstractSparseArray AbstractSparseMatrix AbstractSparseVector AbstractString AbstractUnitRange AbstractVecOrMat AbstractVector Any ArgumentError Array AssertionError Associative Base64DecodePipe Base64EncodePipe Bidiagonal BigFloat BigInt BitArray BitMatrix BitVector Bool BoundsError BufferStream CachingPool CapturedException CartesianIndex CartesianRange Cchar Cdouble Cfloat Channel Char Cint Cintmax_t Clong Clonglong ClusterManager Cmd CodeInfo Colon Complex Complex128 Complex32 Complex64 CompositeException Condition ConjArray ConjMatrix ConjVector Cptrdiff_t Cshort Csize_t Cssize_t Cstring Cuchar Cuint Cuintmax_t Culong Culonglong Cushort Cwchar_t Cwstring DataType Date DateFormat DateTime DenseArray DenseMatrix DenseVecOrMat DenseVector Diagonal Dict DimensionMismatch Dims DirectIndexString Display DivideError DomainError EOFError EachLine Enum Enumerate ErrorException Exception ExponentialBackOff Expr Factorization FileMonitor Float16 Float32 Float64 Function Future GlobalRef GotoNode HTML Hermitian IO IOBuffer IOContext IOStream IPAddr IPv4 IPv6 IndexCartesian IndexLinear IndexStyle InexactError InitError Int Int128 Int16 Int32 Int64 Int8 IntSet Integer InterruptException InvalidStateException Irrational KeyError LabelNode LinSpace LineNumberNode LoadError LowerTriangular MIME Matrix MersenneTwister Method MethodError MethodTable Module NTuple NewvarNode NullException Nullable Number ObjectIdDict OrdinalRange OutOfMemoryError OverflowError Pair ParseError PartialQuickSort PermutedDimsArray Pipe PollingFileWatcher ProcessExitedException Ptr QuoteNode RandomDevice Range RangeIndex Rational RawFD ReadOnlyMemoryError Real ReentrantLock Ref Regex RegexMatch RemoteChannel RemoteException RevString RoundingMode RowVector SSAValue SegmentationFault SerializationState Set SharedArray SharedMatrix SharedVector Signed SimpleVector Slot SlotNumber SparseMatrixCSC SparseVector StackFrame StackOverflowError StackTrace StepRange StepRangeLen StridedArray StridedMatrix StridedVecOrMat StridedVector String SubArray SubString SymTridiagonal Symbol Symmetric SystemError TCPSocket Task Text TextDisplay Timer Tridiagonal Tuple Type TypeError TypeMapEntry TypeMapLevel TypeName TypeVar TypedSlot UDPSocket UInt UInt128 UInt16 UInt32 UInt64 UInt8 UndefRefError UndefVarError UnicodeError UniformScaling Union UnionAll UnitRange Unsigned UpperTriangular Val Vararg VecElement VecOrMat Vector VersionNumber Void WeakKeyDict WeakRef WorkerConfig WorkerPool "},a={keywords:t,illegal:/<\//},n={className:"subst",begin:/\$\(/,end:/\)/,keywords:t},o={className:"variable",begin:"\\$"+r},i={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],variants:[{begin:/\w*"""/,end:/"""\w*/,relevance:10},{begin:/\w*"/,end:/"\w*/}]},l={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],begin:"`",end:"`"},s={className:"meta",begin:"@"+r};return a.name="Julia",a.contains=[{className:"number",begin:/(\b0x[\d_]*(\.[\d_]*)?|0x\.\d[\d_]*)p[-+]?\d+|\b0[box][a-fA-F0-9][a-fA-F0-9_]*|(\b\d[\d_]*(\.[\d_]*)?|\.\d[\d_]*)([eEfF][-+]?\d+)?/,relevance:0},{className:"string",begin:/'(.|\\[xXuU][a-zA-Z0-9]+)'/},i,l,s,{className:"comment",variants:[{begin:"#=",end:"=#",relevance:10},{begin:"#",end:"$"}]},e.HASH_COMMENT_MODE,{className:"keyword",begin:"\\b(((abstract|primitive)\\s+)type|(mutable\\s+)?struct)\\b"},{begin:/<:/}],n.contains=a.contains,a}}()); +hljs.registerLanguage("nim",function(){"use strict";return function(e){return{name:"Nim",aliases:["nim"],keywords:{keyword:"addr and as asm bind block break case cast const continue converter discard distinct div do elif else end enum except export finally for from func generic if import in include interface is isnot iterator let macro method mixin mod nil not notin object of or out proc ptr raise ref return shl shr static template try tuple type using var when while with without xor yield",literal:"shared guarded stdin stdout stderr result true false",built_in:"int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 float float32 float64 bool char string cstring pointer expr stmt void auto any range array openarray varargs seq set clong culong cchar cschar cshort cint csize clonglong cfloat cdouble clongdouble cuchar cushort cuint culonglong cstringarray semistatic"},contains:[{className:"meta",begin:/{\./,end:/\.}/,relevance:10},{className:"string",begin:/[a-zA-Z]\w*"/,end:/"/,contains:[{begin:/""/}]},{className:"string",begin:/([a-zA-Z]\w*)?"""/,end:/"""/},e.QUOTE_STRING_MODE,{className:"type",begin:/\b[A-Z]\w+\b/,relevance:0},{className:"number",relevance:0,variants:[{begin:/\b(0[xX][0-9a-fA-F][_0-9a-fA-F]*)('?[iIuU](8|16|32|64))?/},{begin:/\b(0o[0-7][_0-7]*)('?[iIuUfF](8|16|32|64))?/},{begin:/\b(0(b|B)[01][_01]*)('?[iIuUfF](8|16|32|64))?/},{begin:/\b(\d[_\d]*)('?[iIuUfF](8|16|32|64))?/}]},e.HASH_COMMENT_MODE]}}}()); +hljs.registerLanguage("nix",function(){"use strict";return function(e){var n={keyword:"rec with let in inherit assert if else then",literal:"true false or and null",built_in:"import abort baseNameOf dirOf isNull builtins map removeAttrs throw toString derivation"},i={className:"subst",begin:/\$\{/,end:/}/,keywords:n},t={className:"string",contains:[i],variants:[{begin:"''",end:"''"},{begin:'"',end:'"'}]},s=[e.NUMBER_MODE,e.HASH_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t,{begin:/[a-zA-Z0-9-_]+(\s*=)/,returnBegin:!0,relevance:0,contains:[{className:"attr",begin:/\S+/}]}];return i.contains=s,{name:"Nix",aliases:["nixos"],keywords:n,contains:s}}}()); +hljs.registerLanguage("r",function(){"use strict";return function(e){var n="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{name:"R",contains:[e.HASH_COMMENT_MODE,{begin:n,keywords:{$pattern:n,keyword:"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},relevance:0},{className:"number",begin:"0[xX][0-9a-fA-F]+[Li]?\\b",relevance:0},{className:"number",begin:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",relevance:0},{className:"number",begin:"\\d+\\.(?!\\d)(?:i\\b)?",relevance:0},{className:"number",begin:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{className:"number",begin:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{begin:"`",end:"`",relevance:0},{className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:'"',end:'"'},{begin:"'",end:"'"}]}]}}}()); +hljs.registerLanguage("scala",function(){"use strict";return function(e){var n={className:"subst",variants:[{begin:"\\$[A-Za-z0-9_]+"},{begin:"\\${",end:"}"}]},a={className:"string",variants:[{begin:'"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:'"""',end:'"""',relevance:10},{begin:'[a-z]+"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE,n]},{className:"string",begin:'[a-z]+"""',end:'"""',contains:[n],relevance:10}]},s={className:"type",begin:"\\b[A-Z][A-Za-z0-9_]*",relevance:0},t={className:"title",begin:/[^0-9\n\t "'(),.`{}\[\]:;][^\n\t "'(),.`{}\[\]:;]+|[^0-9\n\t "'(),.`{}\[\]:;=]/,relevance:0},i={className:"class",beginKeywords:"class object trait type",end:/[:={\[\n;]/,excludeEnd:!0,contains:[{beginKeywords:"extends with",relevance:10},{begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},t]},l={className:"function",beginKeywords:"def",end:/[:={\[(\n;]/,excludeEnd:!0,contains:[t]};return{name:"Scala",keywords:{literal:"true false null",keyword:"type yield lazy override def with val var sealed abstract private trait object if forSome for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws implicit"},contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,{className:"symbol",begin:"'\\w[\\w\\d_]*(?!')"},s,l,i,e.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"}]}}}()); +hljs.registerLanguage("x86asm",function(){"use strict";return function(s){return{name:"Intel x86 Assembly",case_insensitive:!0,keywords:{$pattern:"[.%]?"+s.IDENT_RE,keyword:"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63",built_in:"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr",meta:"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__"},contains:[s.COMMENT(";","$",{relevance:0}),{className:"number",variants:[{begin:"\\b(?:([0-9][0-9_]*)?\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\b",relevance:0},{begin:"\\$[0-9][0-9A-Fa-f]*",relevance:0},{begin:"\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\b"},{begin:"\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\b"}]},s.QUOTE_STRING_MODE,{className:"string",variants:[{begin:"'",end:"[^\\\\]'"},{begin:"`",end:"[^\\\\]`"}],relevance:0},{className:"symbol",variants:[{begin:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)"},{begin:"^\\s*%%[A-Za-z0-9_$#@~.?]*:"}],relevance:0},{className:"subst",begin:"%[0-9]+",relevance:0},{className:"subst",begin:"%!S+",relevance:0},{className:"meta",begin:/^\s*\.[\w_-]+/}]}}}()); \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..1f21cf4 --- /dev/null +++ b/index.html @@ -0,0 +1,329 @@ + + + + + + 简介 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

Rust 宏小册

+
+

注意:这是对 Daniel Keep 撰写的书 +的续写,自 2016 年初夏以来,那本书就没再更新。

+
+

本书的续写者为 Veykril,使用 +mdBook 工具生成。你可以浏览本书的 +英文版本,和 github +仓库1

+

这本书尝试提炼出 Rust 社区对 Rust 宏的共识,准确地说,是 通过例子 来讲述宏2。 +因此,欢迎 PR 补充和提 issue。

+

如果你对某些书中的内容不清楚,或者不理解,别害怕提 issue +来请求澄清那部分。本书的目标是尽可能成为最好的(宏)学习资料。

+

在我学习 Rust 的时候,Little Book of Rust Macros 原作 +通过例子 的方式非常给力地帮助过我理解(声明)宏。很遗憾的是,Rust +语言与宏系统持续改进时,原作者不再更新书籍。

+

这也是我想尽可能地更新这本书的原因,并且我尽可能地把新发现的事情增加到书中,以帮助新的 +Rust 宏学习者理解宏系统 —— 这个让很多人困惑的部分。

+
+

这本书认为你应该对 Rust 有基本的了解,它不会解释 Rust +语言特性或者与宏无关的结构,但不会假设你提前掌握宏的知识。

+

你必须至少阅读和理解了 Rust Book +的前七章 —— 当然,建议你阅读完 Rust Book 的大部分内容。

+
+
1 +

译者注:我对原作和续作进行了梳理,见 翻译说明

+
+
2 +

译者注:2022 年的中文版随续作更新了过程宏,而声明宏也一直在演进。

+
+

致谢

+

非常感谢 Daniel Keep 最初写下这本书。3

+

感谢对原书提出建议和更正的读者: +IcyFoxy、 Rym、 TheMicroWorm、 Yurume、 akavel、 cmr、 eddyb、 ogham 和 snake_case。

+
3 +

译者注:非常感谢 Veykril 不懈地更新此书。感谢 +DaseinPhaos 对原作的翻译。此外,本书的右侧 +TOC 是由 mdbook-theme 所提供。

+
+

版权声明

+

这本书沿袭了原作的版权声明,因此具有 CC BY-SA 4.0MIT license 的双重许可。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/introduction.html b/introduction.html new file mode 100644 index 0000000..1f21cf4 --- /dev/null +++ b/introduction.html @@ -0,0 +1,329 @@ + + + + + + 简介 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

Rust 宏小册

+
+

注意:这是对 Daniel Keep 撰写的书 +的续写,自 2016 年初夏以来,那本书就没再更新。

+
+

本书的续写者为 Veykril,使用 +mdBook 工具生成。你可以浏览本书的 +英文版本,和 github +仓库1

+

这本书尝试提炼出 Rust 社区对 Rust 宏的共识,准确地说,是 通过例子 来讲述宏2。 +因此,欢迎 PR 补充和提 issue。

+

如果你对某些书中的内容不清楚,或者不理解,别害怕提 issue +来请求澄清那部分。本书的目标是尽可能成为最好的(宏)学习资料。

+

在我学习 Rust 的时候,Little Book of Rust Macros 原作 +通过例子 的方式非常给力地帮助过我理解(声明)宏。很遗憾的是,Rust +语言与宏系统持续改进时,原作者不再更新书籍。

+

这也是我想尽可能地更新这本书的原因,并且我尽可能地把新发现的事情增加到书中,以帮助新的 +Rust 宏学习者理解宏系统 —— 这个让很多人困惑的部分。

+
+

这本书认为你应该对 Rust 有基本的了解,它不会解释 Rust +语言特性或者与宏无关的结构,但不会假设你提前掌握宏的知识。

+

你必须至少阅读和理解了 Rust Book +的前七章 —— 当然,建议你阅读完 Rust Book 的大部分内容。

+
+
1 +

译者注:我对原作和续作进行了梳理,见 翻译说明

+
+
2 +

译者注:2022 年的中文版随续作更新了过程宏,而声明宏也一直在演进。

+
+

致谢

+

非常感谢 Daniel Keep 最初写下这本书。3

+

感谢对原书提出建议和更正的读者: +IcyFoxy、 Rym、 TheMicroWorm、 Yurume、 akavel、 cmr、 eddyb、 ogham 和 snake_case。

+
3 +

译者注:非常感谢 Veykril 不懈地更新此书。感谢 +DaseinPhaos 对原作的翻译。此外,本书的右侧 +TOC 是由 mdbook-theme 所提供。

+
+

版权声明

+

这本书沿袭了原作的版权声明,因此具有 CC BY-SA 4.0MIT license 的双重许可。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mark.min.js b/mark.min.js new file mode 100644 index 0000000..1636231 --- /dev/null +++ b/mark.min.js @@ -0,0 +1,7 @@ +/*!*************************************************** +* mark.js v8.11.1 +* https://markjs.io/ +* Copyright (c) 2014–2018, Julian Kühnel +* Released under the MIT license https://git.io/vwTVl +*****************************************************/ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Mark=t()}(this,function(){"use strict";var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},n=function(){function e(e,t){for(var n=0;n1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;t(this,e),this.ctx=n,this.iframes=r,this.exclude=i,this.iframesTimeout=o}return n(e,[{key:"getContexts",value:function(){var e=[];return(void 0!==this.ctx&&this.ctx?NodeList.prototype.isPrototypeOf(this.ctx)?Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?this.ctx:"string"==typeof this.ctx?Array.prototype.slice.call(document.querySelectorAll(this.ctx)):[this.ctx]:[]).forEach(function(t){var n=e.filter(function(e){return e.contains(t)}).length>0;-1!==e.indexOf(t)||n||e.push(t)}),e}},{key:"getIframeContents",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},r=void 0;try{var i=e.contentWindow;if(r=i.document,!i||!r)throw new Error("iframe inaccessible")}catch(e){n()}r&&t(r)}},{key:"isIframeBlank",value:function(e){var t="about:blank",n=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&n!==t&&n}},{key:"observeIframeLoad",value:function(e,t,n){var r=this,i=!1,o=null,a=function a(){if(!i){i=!0,clearTimeout(o);try{r.isIframeBlank(e)||(e.removeEventListener("load",a),r.getIframeContents(e,t,n))}catch(e){n()}}};e.addEventListener("load",a),o=setTimeout(a,this.iframesTimeout)}},{key:"onIframeReady",value:function(e,t,n){try{"complete"===e.contentWindow.document.readyState?this.isIframeBlank(e)?this.observeIframeLoad(e,t,n):this.getIframeContents(e,t,n):this.observeIframeLoad(e,t,n)}catch(e){n()}}},{key:"waitForIframes",value:function(e,t){var n=this,r=0;this.forEachIframe(e,function(){return!0},function(e){r++,n.waitForIframes(e.querySelector("html"),function(){--r||t()})},function(e){e||t()})}},{key:"forEachIframe",value:function(t,n,r){var i=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},a=t.querySelectorAll("iframe"),s=a.length,c=0;a=Array.prototype.slice.call(a);var u=function(){--s<=0&&o(c)};s||u(),a.forEach(function(t){e.matches(t,i.exclude)?u():i.onIframeReady(t,function(e){n(t)&&(c++,r(e)),u()},u)})}},{key:"createIterator",value:function(e,t,n){return document.createNodeIterator(e,t,n,!1)}},{key:"createInstanceOnIframe",value:function(t){return new e(t.querySelector("html"),this.iframes)}},{key:"compareNodeIframe",value:function(e,t,n){if(e.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_PRECEDING){if(null===t)return!0;if(t.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING)return!0}return!1}},{key:"getIteratorNode",value:function(e){var t=e.previousNode();return{prevNode:t,node:null===t?e.nextNode():e.nextNode()&&e.nextNode()}}},{key:"checkIframeFilter",value:function(e,t,n,r){var i=!1,o=!1;return r.forEach(function(e,t){e.val===n&&(i=t,o=e.handled)}),this.compareNodeIframe(e,t,n)?(!1!==i||o?!1===i||o||(r[i].handled=!0):r.push({val:n,handled:!0}),!0):(!1===i&&r.push({val:n,handled:!1}),!1)}},{key:"handleOpenIframes",value:function(e,t,n,r){var i=this;e.forEach(function(e){e.handled||i.getIframeContents(e.val,function(e){i.createInstanceOnIframe(e).forEachNode(t,n,r)})})}},{key:"iterateThroughNodes",value:function(e,t,n,r,i){for(var o,a=this,s=this.createIterator(t,e,r),c=[],u=[],l=void 0,h=void 0;void 0,o=a.getIteratorNode(s),h=o.prevNode,l=o.node;)this.iframes&&this.forEachIframe(t,function(e){return a.checkIframeFilter(l,h,e,c)},function(t){a.createInstanceOnIframe(t).forEachNode(e,function(e){return u.push(e)},r)}),u.push(l);u.forEach(function(e){n(e)}),this.iframes&&this.handleOpenIframes(c,e,n,r),i()}},{key:"forEachNode",value:function(e,t,n){var r=this,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},o=this.getContexts(),a=o.length;a||i(),o.forEach(function(o){var s=function(){r.iterateThroughNodes(e,o,t,n,function(){--a<=0&&i()})};r.iframes?r.waitForIframes(o,s):s()})}}],[{key:"matches",value:function(e,t){var n="string"==typeof t?[t]:t,r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(r){var i=!1;return n.every(function(t){return!r.call(e,t)||(i=!0,!1)}),i}return!1}}]),e}(),o=function(){function e(n){t(this,e),this.opt=r({},{diacritics:!0,synonyms:{},accuracy:"partially",caseSensitive:!1,ignoreJoiners:!1,ignorePunctuation:[],wildcards:"disabled"},n)}return n(e,[{key:"create",value:function(e){return"disabled"!==this.opt.wildcards&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),"disabled"!==this.opt.wildcards&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),new RegExp(e,"gm"+(this.opt.caseSensitive?"":"i"))}},{key:"escapeStr",value:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}},{key:"createSynonymsRegExp",value:function(e){var t=this.opt.synonyms,n=this.opt.caseSensitive?"":"i",r=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(var i in t)if(t.hasOwnProperty(i)){var o=t[i],a="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(i):this.escapeStr(i),s="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(o):this.escapeStr(o);""!==a&&""!==s&&(e=e.replace(new RegExp("("+this.escapeStr(a)+"|"+this.escapeStr(s)+")","gm"+n),r+"("+this.processSynonyms(a)+"|"+this.processSynonyms(s)+")"+r))}return e}},{key:"processSynonyms",value:function(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}},{key:"setupWildcardsRegExp",value:function(e){return(e=e.replace(/(?:\\)*\?/g,function(e){return"\\"===e.charAt(0)?"?":""})).replace(/(?:\\)*\*/g,function(e){return"\\"===e.charAt(0)?"*":""})}},{key:"createWildcardsRegExp",value:function(e){var t="withSpaces"===this.opt.wildcards;return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}},{key:"setupIgnoreJoinersRegExp",value:function(e){return e.replace(/[^(|)\\]/g,function(e,t,n){var r=n.charAt(t+1);return/[(|)\\]/.test(r)||""===r?e:e+"\0"})}},{key:"createJoinersRegExp",value:function(e){var t=[],n=this.opt.ignorePunctuation;return Array.isArray(n)&&n.length&&t.push(this.escapeStr(n.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join("["+t.join("")+"]*"):e}},{key:"createDiacriticsRegExp",value:function(e){var t=this.opt.caseSensitive?"":"i",n=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"],r=[];return e.split("").forEach(function(i){n.every(function(n){if(-1!==n.indexOf(i)){if(r.indexOf(n)>-1)return!1;e=e.replace(new RegExp("["+n+"]","gm"+t),"["+n+"]"),r.push(n)}return!0})}),e}},{key:"createMergedBlanksRegExp",value:function(e){return e.replace(/[\s]+/gim,"[\\s]+")}},{key:"createAccuracyRegExp",value:function(e){var t=this,n=this.opt.accuracy,r="string"==typeof n?n:n.value,i="";switch(("string"==typeof n?[]:n.limiters).forEach(function(e){i+="|"+t.escapeStr(e)}),r){case"partially":default:return"()("+e+")";case"complementary":return"()([^"+(i="\\s"+(i||this.escapeStr("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿")))+"]*"+e+"[^"+i+"]*)";case"exactly":return"(^|\\s"+i+")("+e+")(?=$|\\s"+i+")"}}}]),e}(),a=function(){function a(e){t(this,a),this.ctx=e,this.ie=!1;var n=window.navigator.userAgent;(n.indexOf("MSIE")>-1||n.indexOf("Trident")>-1)&&(this.ie=!0)}return n(a,[{key:"log",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"debug",r=this.opt.log;this.opt.debug&&"object"===(void 0===r?"undefined":e(r))&&"function"==typeof r[n]&&r[n]("mark.js: "+t)}},{key:"getSeparatedKeywords",value:function(e){var t=this,n=[];return e.forEach(function(e){t.opt.separateWordSearch?e.split(" ").forEach(function(e){e.trim()&&-1===n.indexOf(e)&&n.push(e)}):e.trim()&&-1===n.indexOf(e)&&n.push(e)}),{keywords:n.sort(function(e,t){return t.length-e.length}),length:n.length}}},{key:"isNumeric",value:function(e){return Number(parseFloat(e))==e}},{key:"checkRanges",value:function(e){var t=this;if(!Array.isArray(e)||"[object Object]"!==Object.prototype.toString.call(e[0]))return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];var n=[],r=0;return e.sort(function(e,t){return e.start-t.start}).forEach(function(e){var i=t.callNoMatchOnInvalidRanges(e,r),o=i.start,a=i.end;i.valid&&(e.start=o,e.length=a-o,n.push(e),r=a)}),n}},{key:"callNoMatchOnInvalidRanges",value:function(e,t){var n=void 0,r=void 0,i=!1;return e&&void 0!==e.start?(r=(n=parseInt(e.start,10))+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&r-t>0&&r-n>0?i=!0:(this.log("Ignoring invalid or overlapping range: "+JSON.stringify(e)),this.opt.noMatch(e))):(this.log("Ignoring invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:n,end:r,valid:i}}},{key:"checkWhitespaceRanges",value:function(e,t,n){var r=void 0,i=!0,o=n.length,a=t-o,s=parseInt(e.start,10)-a;return(r=(s=s>o?o:s)+parseInt(e.length,10))>o&&(r=o,this.log("End range automatically set to the max value of "+o)),s<0||r-s<0||s>o||r>o?(i=!1,this.log("Invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)):""===n.substring(s,r).replace(/\s+/g,"")&&(i=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:s,end:r,valid:i}}},{key:"getTextNodes",value:function(e){var t=this,n="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,function(e){r.push({start:n.length,end:(n+=e.textContent).length,node:e})},function(e){return t.matchesExclude(e.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},function(){e({value:n,nodes:r})})}},{key:"matchesExclude",value:function(e){return i.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}},{key:"wrapRangeInTextNode",value:function(e,t,n){var r=this.opt.element?this.opt.element:"mark",i=e.splitText(t),o=i.splitText(n-t),a=document.createElement(r);return a.setAttribute("data-markjs","true"),this.opt.className&&a.setAttribute("class",this.opt.className),a.textContent=i.textContent,i.parentNode.replaceChild(a,i),o}},{key:"wrapRangeInMappedTextNode",value:function(e,t,n,r,i){var o=this;e.nodes.every(function(a,s){var c=e.nodes[s+1];if(void 0===c||c.start>t){if(!r(a.node))return!1;var u=t-a.start,l=(n>a.end?a.end:n)-a.start,h=e.value.substr(0,a.start),f=e.value.substr(l+a.start);if(a.node=o.wrapRangeInTextNode(a.node,u,l),e.value=h+f,e.nodes.forEach(function(t,n){n>=s&&(e.nodes[n].start>0&&n!==s&&(e.nodes[n].start-=l),e.nodes[n].end-=l)}),n-=l,i(a.node.previousSibling,a.start),!(n>a.end))return!1;t=a.end}return!0})}},{key:"wrapGroups",value:function(e,t,n,r){return r((e=this.wrapRangeInTextNode(e,t,t+n)).previousSibling),e}},{key:"separateGroups",value:function(e,t,n,r,i){for(var o=t.length,a=1;a-1&&r(t[a],e)&&(e=this.wrapGroups(e,s,t[a].length,i))}return e}},{key:"wrapMatches",value:function(e,t,n,r,i){var o=this,a=0===t?0:t+1;this.getTextNodes(function(t){t.nodes.forEach(function(t){t=t.node;for(var i=void 0;null!==(i=e.exec(t.textContent))&&""!==i[a];){if(o.opt.separateGroups)t=o.separateGroups(t,i,a,n,r);else{if(!n(i[a],t))continue;var s=i.index;if(0!==a)for(var c=1;c=n[1]?(e.length>n[1]&&(r="invalid"),n.shift(),n.shift(),this.next=n.shift()):this.next="",r},regex:/"#*/,next:"start"},{defaultToken:"string.quoted.raw.source.rust"}]},{token:"string.quoted.double.source.rust",regex:'"',push:[{token:"string.quoted.double.source.rust",regex:'"',next:"pop"},{token:"constant.character.escape.source.rust",regex:s},{defaultToken:"string.quoted.double.source.rust"}]},{token:["keyword.source.rust","text","entity.name.function.source.rust"],regex:"\\b(fn)(\\s+)((?:r#)?[a-zA-Z_][a-zA-Z0-9_]*)"},{token:"support.constant",regex:"\\b[a-zA-Z_][\\w\\d]*::"},{token:"keyword.source.rust",regex:"\\b(?:abstract|alignof|as|become|box|break|catch|continue|const|crate|default|do|dyn|else|enum|extern|for|final|if|impl|in|let|loop|macro|match|mod|move|mut|offsetof|override|priv|proc|pub|pure|ref|return|self|sizeof|static|struct|super|trait|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\\b"},{token:"storage.type.source.rust",regex:"\\b(?:Self|isize|usize|char|bool|u8|u16|u32|u64|u128|f16|f32|f64|i8|i16|i32|i64|i128|str|option|either|c_float|c_double|c_void|FILE|fpos_t|DIR|dirent|c_char|c_schar|c_uchar|c_short|c_ushort|c_int|c_uint|c_long|c_ulong|size_t|ptrdiff_t|clock_t|time_t|c_longlong|c_ulonglong|intptr_t|uintptr_t|off_t|dev_t|ino_t|pid_t|mode_t|ssize_t)\\b"},{token:"variable.language.source.rust",regex:"\\bself\\b"},{token:"comment.line.doc.source.rust",regex:"//!.*$"},{token:"comment.line.double-dash.source.rust",regex:"//.*$"},{token:"comment.start.block.source.rust",regex:"/\\*",stateName:"comment",push:[{token:"comment.start.block.source.rust",regex:"/\\*",push:"comment"},{token:"comment.end.block.source.rust",regex:"\\*/",next:"pop"},{defaultToken:"comment.block.source.rust"}]},{token:"keyword.operator",regex:/\$|[-=]>|[-+%^=!&|<>]=?|[*/](?![*/])=?/},{token:"punctuation.operator",regex:/[?:,;.]/},{token:"paren.lparen",regex:/[\[({]/},{token:"paren.rparen",regex:/[\])}]/},{token:"constant.language.source.rust",regex:"\\b(?:true|false|Some|None|Ok|Err)\\b"},{token:"support.constant.source.rust",regex:"\\b(?:EXIT_FAILURE|EXIT_SUCCESS|RAND_MAX|EOF|SEEK_SET|SEEK_CUR|SEEK_END|_IOFBF|_IONBF|_IOLBF|BUFSIZ|FOPEN_MAX|FILENAME_MAX|L_tmpnam|TMP_MAX|O_RDONLY|O_WRONLY|O_RDWR|O_APPEND|O_CREAT|O_EXCL|O_TRUNC|S_IFIFO|S_IFCHR|S_IFBLK|S_IFDIR|S_IFREG|S_IFMT|S_IEXEC|S_IWRITE|S_IREAD|S_IRWXU|S_IXUSR|S_IWUSR|S_IRUSR|F_OK|R_OK|W_OK|X_OK|STDIN_FILENO|STDOUT_FILENO|STDERR_FILENO)\\b"},{token:"meta.preprocessor.source.rust",regex:"\\b\\w\\(\\w\\)*!|#\\[[\\w=\\(\\)_]+\\]\\b"},{token:"constant.numeric.source.rust",regex:/\b(?:0x[a-fA-F0-9_]+|0o[0-7_]+|0b[01_]+|[0-9][0-9_]*(?!\.))(?:[iu](?:size|8|16|32|64|128))?\b/},{token:"constant.numeric.source.rust",regex:/\b(?:[0-9][0-9_]*)(?:\.[0-9][0-9_]*)?(?:[Ee][+-][0-9][0-9_]*)?(?:f32|f64)?\b/}]},this.normalizeRules()};o.metaData={fileTypes:["rs","rc"],foldingStartMarker:"^.*\\bfn\\s*(\\w+\\s*)?\\([^\\)]*\\)(\\s*\\{[^\\}]*)?\\s*$",foldingStopMarker:"^\\s*\\}",name:"Rust",scopeName:"source.rust"},r.inherits(o,i),t.RustHighlightRules=o}),ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/([\{\[\(])[^\}\]\)]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{\(]*([\}\]\)])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),ace.define("ace/mode/rust",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/rust_highlight_rules","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./rust_highlight_rules").RustHighlightRules,o=e("./folding/cstyle").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o,this.$behaviour=this.$defaultBehaviour};r.inherits(u,i),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/",nestable:!0},this.$quotes={'"':'"'},this.$id="ace/mode/rust"}.call(u.prototype),t.Mode=u}); (function() { + ace.require(["ace/mode/rust"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); diff --git a/proc-macros.html b/proc-macros.html new file mode 100644 index 0000000..2e86e60 --- /dev/null +++ b/proc-macros.html @@ -0,0 +1,302 @@ + + + + + + 过程宏 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

过程宏

+

本章将介绍 Rust 的第二种语法扩展类型:过程宏。

+

声明宏 一样,这一部分也分为 思路 +和实战 (WIP) 的两个子章节,前者是更正式的介绍,后者是更注重实践的子章。

+

文中介绍的许多基本信息都来自于 Rust Reference,因为目前关于过程宏的大部分知识都在那。

+
+

译者注:在翻译(或者说知道)这部分内容之前,我自己也总结了一些学习过程宏的经验,你可以在这看到。

+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/proc-macros/hygiene.html b/proc-macros/hygiene.html new file mode 100644 index 0000000..29a9551 --- /dev/null +++ b/proc-macros/hygiene.html @@ -0,0 +1,309 @@ + + + + + + 卫生性和 Span - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

卫生性和 Span

+

本章讨论过程宏的卫生性以及对其进行编码的类型 Span

+

TokenStream 中的每个标记都关联了一个 Span,它其中包含一些附加信息。

+

正如其文档所述,Span 表示“一个源代码区域,以及宏展开的信息”。

+

Span 指向原始源代码的一个区域(这对于在正确的位置显示诊断信息很重要),并保持该位置的卫生性。

+

卫生性主要与标识符有关,因为它允许或禁止表示符对调用外部定义的事物进行引用或者被引用。

+

卫生性有 3 种(这可以从 Span 类型的构造函数看到):

+
    +
  • 定义处卫生性 (definition site) (unstable): 表示宏定义处的 Span。带着这种 Span +的标识符不能引用外部定义的内容(即这种标识符无法使用宏定义之外的内容),或者不能被外部调用的东西引用(即宏定义之外的东西无法使用这种标识符)。这就是所谓的“卫生性”。
  • +
  • 混合式卫生性 (mixed site):表示宏定义处或者调用处的 Span,具体取决于标识符的类型。声明宏使用这种卫生性,见此此章
  • +
  • 调用处卫生性 (call site):表示调用处的 +Span。此时,标识符表现得就像是直接在调用处编写的一样,也就是说,它们可以自由地使用调用之外定义的内容,也可以从外部引用它们。这就是所谓的“不卫生” +(unhygienic)。
  • +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/proc-macros/methodical.html b/proc-macros/methodical.html new file mode 100644 index 0000000..8da91c4 --- /dev/null +++ b/proc-macros/methodical.html @@ -0,0 +1,355 @@ + + + + + + 思路 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

思路介绍

+

本章将从整体角度解释和介绍过程宏。

+

声明宏不同,过程宏采用 Rust 函数的形式,接受一个(或两个)标记流并输出一个标记流。

+

过程宏的核心只是一个从 proc-macro crate type 这种类型的库中所导出的公有函数,因此当编写多个过程宏时,你可以将它们全部放在一个 crate 中。

+
+

注意:在使用 Cargo 时,定义一个 proc-macro crate 的方式是将 +Cargo.toml 中的 lib.proc-macro 键设置为 true,就像这样

+
[lib]
+proc-macro = true
+
+
+

proc-macro 类型的 crate 会隐式链接到编译器提供的 proc_macro 库, +proc_macro 库包含了开发过程宏所需的所有内容,并且它公开了两个最重要的类型:

+
    +
  1. TokenStream:它表示我们所熟知的标记树
  2. +
  3. Span:它表示源代码的一部分,主要用于错误信息的报告和卫生性,更多信息请阅读 +卫生性和 Spans 一章
  4. +
+

因为过程宏是存在于 crate 中的函数,所以它们可以像 Rust 项目中的所有其他条目一样使用。

+

使用过程宏只需要将 proc-macro 类型的 crate 添加到项目的依赖关系图中,并将所需的过程宏引入作用域。

+
+

注意:调用过程宏与编译器展开成声明宏是在同一阶段运行,只是过程宏是编译器编译、运行、最后替换或追加的独立的 Rust 程序。

+
+

过程宏的类型

+

过程宏实际上存在三种不同的类型,每种类型的性质都略有不同。1

+
    +
  • 函数式:实现 $name!$input 功能的宏
  • +
  • 属性式:实现 #[$input] 功能的属性
  • +
  • derive 式:实现 #[derive($name)] 功能的属性
  • +
+
1 +

译者注:你可以参考我总结的表

+
+

函数式

+
#[proc_macro]
+pub fn name(input: TokenStream) -> TokenStream {
+    TokenStream::new()
+}
+

属性式

+
#[proc_macro_attribute]
+pub fn name(attr: TokenStream, input: TokenStream) -> TokenStream {
+    TokenStream::new()
+}
+

derive 式

+
#[proc_macro_derive(Name)]
+pub fn my_derive(input: TokenStream) -> TokenStream {
+    TokenStream::new()
+}
+

如上所示,每个函数的基本结构是相同的:一个标记了一个属性的公有函数,这个属性定义了它的过程性宏类型,然后函数返回一个 TokenStream

+

注意,返回类型必须是一个 TokenStream2

+

过程宏也会失败,它们有两种报告错误的方式:

+
    +
  1. panic:此时编译器会捕获到,然后把它作为来自于宏调用的错误发出
  2. +
  3. 调用 compile_error!
  4. +
+
+

注意:如果过程宏内出现无限循环,编译器会长时间等待(挂起),从而造成使用过程宏的 crate 也编译挂起。

+
+
2 +

译者注:而且这个 TokenStream 类型必须是 proc_macro 所公开的 TokenStream,通常使用 quote 库构造这种类型。

+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/proc-macros/methodical/attr.html b/proc-macros/methodical/attr.html new file mode 100644 index 0000000..6ba1f03 --- /dev/null +++ b/proc-macros/methodical/attr.html @@ -0,0 +1,321 @@ + + + + + + 属性式 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

属性式过程宏

+

属性式过程宏定义了可添加到条目的的新外部属性。这种宏通过 #[attr] 或 +#[attr(…)] 方式调用,其中 是任意标记树。

+

一个属性式过程宏的简单框架如下所示:

+
use proc_macro::TokenStream;
+
+#[proc_macro_attribute]
+pub fn tlborm_attribute(input: TokenStream, annotated_item: TokenStream) -> TokenStream {
+    annotated_item
+}
+
+

这里需要注意的是,与其他两种过程宏不同,这种宏有两个输入参数,而不是一个。

+
    +
  • 第一个参数是属性名称后面的带分隔符的标记树,不包括它周围的分隔符。如果只有属性名称(其后不带标记树,比如 #[attr]),则这个参数的值为空。
  • +
  • 第二个参数是添加了该过程宏属性的条目,但不包括该过程宏所定义的属性。因为这是一个 active 属性,在传递给过程宏之前,该属性将从条目中剥离出来。
  • +
+

返回的标记流将完全替换带被添加了该属性的条目。注意,不一定替换成单个条目,替换的结果可以是 0 或更多条目。

+ +

用法示例:

+
use tlborm_proc::tlborm_attribute;
+
+#[tlborm_attribute]
+fn foo() {}
+
+#[tlborm_attribute(attributes are pretty handsome)]
+fn bar() {}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/proc-macros/methodical/derive.html b/proc-macros/methodical/derive.html new file mode 100644 index 0000000..4150677 --- /dev/null +++ b/proc-macros/methodical/derive.html @@ -0,0 +1,358 @@ + + + + + + derive 式 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

derive 式过程宏

+

derive 式过程宏1derive 属性定义了新的输入。这种宏通过将其名称提供给 +derive 属性的输入来调用,例如 #[derive(TlbormDerve)]

+
1 +

译者注:我通常不喜欢把 derive 翻译出来,因为它就像 trait +这个名称那样具体而明确,一目了然。当然,有时我会简写为 “derive 宏”,你称它“派生宏”也行。

+
+

一个 derive 式过程宏的简单框架如下所示:

+
use proc_macro::TokenStream;
+
+#[proc_macro_derive(TlbormDerive)]
+pub fn tlborm_derive(input: TokenStream) -> TokenStream {
+    TokenStream::new()
+}
+
+

proc_macro_derive 稍微特殊一些,因为它需要一个额外的标识符,此标识符将成为 derive 宏的实际名称。

+

输入标记流是添加了 derive 属性的条目,也就是说,它将始终是 enumstruct 或者 union +类型,因为这些是 derive 属性仅可以添加上去的条目。

+

输出的标记流将被 追加2 到带注释的条目所处的块或模块,所以要求标记流由一组有效条目组成。

+
2 +

译者注:属性宏与 derive 宏的显著区别在于,属性宏生成的标记是完全替换性质,而 derive 宏生成的标记是追加性质。

+
+

用法示例:

+
use tlborm_proc::TlbormDerive;
+
+#[derive(TlbormDerive)]
+struct Foo;
+
+

辅助属性

+

derive 宏又有一点特殊,因为它可以添加仅在条目定义范围内可见的附加属性。

+

这些属性被称为派生宏辅助属性 (derive macro helper attributes) ,并且是惰性的(inert)。

+

辅助属性的目的是在每个结构体字段或枚举体成员的基础上为 derive 宏提供额外的可定制性。

+

也就是说这些属性可用于附着在字段或成员上,而且不会对其本身产生影响。

+

又因为它们是“惰性的”,所以它们不会被剥离,并且对所有宏都可见。3

+
3 +

译者注:根据 Reference,除了属性宏的属性是 active 的,其他属性都是 inert 的。

+
+

辅助属性的定义方式是向 proc_macro_derive 属性增加 attributes(helper0, helper1, ..) +参数,该参数可包含用逗号分隔的标识符列表(即辅助属性的名称)。

+

因此,编写带辅助属性的 derive 宏的简单框架如下所示:

+
use proc_macro::TokenStream;
+
+#[proc_macro_derive(TlbormDerive, attributes(tlborm_helper))]
+pub fn tlborm_derive(item: TokenStream) -> TokenStream {
+    TokenStream::new()
+}
+
+

这就是辅助属性的全部内容。在过程宏中使用(或者说消耗)辅助属性,得检查字段和成员的属性,来判断它们是否具有相应的辅助属性。

+

如果条目使用了所有 derive 宏都未定义的辅助属性,那么会出现错误,因为编译器会尝试将这个辅助属性解析为普通属性(而且这个属性并不存在)。

+

用法示例:

+
use tlborm_proc::TlbormDerive;
+
+#[derive(TlbormDerive)]
+struct Foo {
+    #[tlborm_helper]
+    field: u32
+}
+
+#[derive(TlbormDerive)]
+enum Bar {
+    #[tlborm_helper]
+    Variant { #[tlborm_helper] field: u32 }
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/proc-macros/methodical/function-like.html b/proc-macros/methodical/function-like.html new file mode 100644 index 0000000..3670058 --- /dev/null +++ b/proc-macros/methodical/function-like.html @@ -0,0 +1,319 @@ + + + + + + 函数式 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

函数式过程宏

+

类似函数的过程宏,像声明宏那样被调用,即 makro!(…)

+

不过,这类宏是三种宏中最简单的一种。它也是唯一一个在单独看调用形式时,无法与声明宏区分开的宏。

+

类似函数式过程宏的简单编写框架如下所示:

+
use proc_macro::TokenStream;
+
+#[proc_macro]
+pub fn tlborm_fn_macro(input: TokenStream) -> TokenStream {
+    input
+}
+
+

可以看到,这实际上只是从一个 TokenStream 到另一个 TokenStream 的映射,其中 +input 是调用分隔符内的标记。

+

例如,对于示例调用 foo!(bar),输入标记流将由单独的 bar 标记组成。返回的标记流将替换宏调用。

+

这种宏类型与声明宏具有相同的放置和展开规则,即宏必须在调用位置上输出正确的标记流。

+

但是,与声明性宏不同,函式过程宏对其输入没有特定的限制。也就是说,在 再谈元变量与宏展开 +一章中列出的片段分类符跟随限制在这里不适用,因为过程宏直接作用于标记,而不是根据片段分类符或类似的东西(比如反复)匹配它们。

+

话虽如此,很明显,过程宏更强大,因为它们可以任意修改其输入,并生成任何所需的输出,只要输出在 Rust 的语法范围内。

+

用法示例:

+
use tlborm_proc::tlborm_attribute;
+
+fn foo() {
+    tlborm_attribute!(be quick; time is mana);
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/proc-macros/third-party-crates.html b/proc-macros/third-party-crates.html new file mode 100644 index 0000000..2c23b30 --- /dev/null +++ b/proc-macros/third-party-crates.html @@ -0,0 +1,358 @@ + + + + + + 第三方 crates - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

第三方 crates

+
+

注意:编写过程宏并不需要自动链接的 proc_macro crate 之外的 +crate。这里列出 crates 只是使编写它们变得更简单、更简洁,同时由于增加了依赖项,可能会增加过程宏的编译时间。

+
+

过程宏放在 crate 中,因此它们可以自然地依赖于 crates.io 上或其他来源的 crates。

+

crates 生态系统已经有一些非常实用、为过程宏量身定做的库,本章将快速介绍这些库,其中大部分将在接下来的章节中用来实现示例。

+

由于这些只是简单的介绍,如果真的需要使用,建议查看每个库的文档以获得更深入的信息。

+
+

译者注:你可以阅读我对以下这几个库的使用总结

+
+

proc-macro2

+

你可能会认为 proc-macro2proc_macro 的继承者,但实际上肯定不对!

+

这个名字可能有点误导,因为 proc-macro2 实际上只是对 proc_macro 的包装,根据其文档,它用于两个特定目的:

+
    +
  • 将类似与过程宏的功能带到其他上下文中,如 build.rs 和 main.rs
  • +
  • 让过程宏可进行单元测试
  • +
+

由于 proc_macro 只能在 proc-macro 类型的库中使用,所以无法直接使用 proc_macro 库。

+

始终记住,proc-macro2 模仿 proc_macro 的 api,对后者进行包装,让后者的功能在非 proc-macro 类型的库中也能使用。

+

因此,建议基于 proc-macro2 来开发过程宏代码的库,而不是基于 proc_macro +构建,因为这将使这些库可以进行单元测试,这也是以下列出的库传入和返回 proc-macro2::TokenStream 的原因。

+

当需要 proc_macro::TokenStream 时,只需对 proc-macro2::TokenStream 进行 .into() 操作即可获得 proc_macro 的版本,反之亦然。

+

使用 proc-macro2 的过程宏通常会以别名的形式导入,比如使用 use proc-macro2::TokenStream as TokenStream2 来导入 proc-macro2::TokenStream

+

quote

+

quote 主要公开了一个声明宏:quote!

+

这个小小的宏让你轻松创建标记流,使用方法是将实际的源代码写出为 Rust 语法。

+

同时该宏还允许你将标记直接插入到编写的语法中:

+
    +
  1. 使用 #local 语法进行插值,其中 local 指的是当前作用域中的一个 local。1
  2. +
  3. 使用 #(#local)* 来对实现了 ToTokens 的类型的迭代器进行插值,其工作原理类似于声明宏的反复,因为它们允许在反复中使用分隔符和额外的标记。
  4. +
+
1 +

译者注:这里的“插值”并不局限于插入“值或者表达式”,可以插入任何符合 Rust 语法的东西,比如标识符、条目、模块等等。

+
+
let name = /* 某个标识符 */;
+let exprs = /* 某个对表达式标记流的迭代器 */;
+let expanded = quote! {
+    impl SomeTrait for #name { // #name 将插入上述的局部名称
+        fn some_function(&self) -> usize {
+            #( #exprs )+* // 通过迭代生成表达式
+        }
+    }
+};
+
+

在准备输出时,quote! 是一个非常有用的工具,它避免了通过逐个插入标记来创建标记流。

+
+

注意:如前所述,此 crate 使用 proc_macro2,因此 quote! 将返回 proc-macro2::TokenStream 类型。

+
+

syn

+

syn 是一个解析库,用于将 Rust 标记流解析为 Rust 源代码的语法树。

+

它是一个功能非常强大的库,使得解析过程宏输入变得非常容易,而 proc_macro 本身不公开任何类型的解析功能,只公开标记。

+

由于这个库可能是一个严重的编译依赖项,它大量使用 feature 控制来允许用户根据需要将其功能剪裁得尽可能小。

+

那么,它能提供什么呢?很多东西。

+

首先,当启用 full feature 时,它具有对所有标准 Rust 语法节点的定义和从而能够完全解析 Rust 语法。

+

在启用 derive feature (默认开启)之后,它还提供一个 DeriveInput 类型,该类型封装了传递给 derive 宏输入所有信息。

+

在启用 parsingproc-macro feature (默认开启)之后,DeriveInput 可以直接与 parse_macro_input! 配合使用,以将标记流解析为所需的类型。

+

如果 Rust 语法不能解决你的问题,或者说你希望解析自定义的非 Rust 语法,那么这个库还提供了一个通用的[解析 API][parse],主要是以 +Parse trait 的形式(这需要 parsing feature,默认启用)。

+

除此之外,该库公开的类型保留了位置信息和 Span,这让过程宏发出详细的错误消息,指向关注点的宏输入。

+

由于这又是一个过程宏的库,它利用了 proc-macro2 的类型,因此可能需要转换成 proc_macro 的对应类型。

+
+

我对 syn 做了更系统的梳理,你可以阅读一下

+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/searcher.js b/searcher.js new file mode 100644 index 0000000..dc03e0a --- /dev/null +++ b/searcher.js @@ -0,0 +1,483 @@ +"use strict"; +window.search = window.search || {}; +(function search(search) { + // Search functionality + // + // You can use !hasFocus() to prevent keyhandling in your key + // event handlers while the user is typing their search. + + if (!Mark || !elasticlunr) { + return; + } + + //IE 11 Compatibility from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith + if (!String.prototype.startsWith) { + String.prototype.startsWith = function(search, pos) { + return this.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search; + }; + } + + var search_wrap = document.getElementById('search-wrapper'), + searchbar = document.getElementById('searchbar'), + searchbar_outer = document.getElementById('searchbar-outer'), + searchresults = document.getElementById('searchresults'), + searchresults_outer = document.getElementById('searchresults-outer'), + searchresults_header = document.getElementById('searchresults-header'), + searchicon = document.getElementById('search-toggle'), + content = document.getElementById('content'), + + searchindex = null, + doc_urls = [], + results_options = { + teaser_word_count: 30, + limit_results: 30, + }, + search_options = { + bool: "AND", + expand: true, + fields: { + title: {boost: 1}, + body: {boost: 1}, + breadcrumbs: {boost: 0} + } + }, + mark_exclude = [], + marker = new Mark(content), + current_searchterm = "", + URL_SEARCH_PARAM = 'search', + URL_MARK_PARAM = 'highlight', + teaser_count = 0, + + SEARCH_HOTKEY_KEYCODE = 83, + ESCAPE_KEYCODE = 27, + DOWN_KEYCODE = 40, + UP_KEYCODE = 38, + SELECT_KEYCODE = 13; + + function hasFocus() { + return searchbar === document.activeElement; + } + + function removeChildren(elem) { + while (elem.firstChild) { + elem.removeChild(elem.firstChild); + } + } + + // Helper to parse a url into its building blocks. + function parseURL(url) { + var a = document.createElement('a'); + a.href = url; + return { + source: url, + protocol: a.protocol.replace(':',''), + host: a.hostname, + port: a.port, + params: (function(){ + var ret = {}; + var seg = a.search.replace(/^\?/,'').split('&'); + var len = seg.length, i = 0, s; + for (;i': '>', + '"': '"', + "'": ''' + }; + var repl = function(c) { return MAP[c]; }; + return function(s) { + return s.replace(/[&<>'"]/g, repl); + }; + })(); + + function formatSearchMetric(count, searchterm) { + if (count == 1) { + return count + " search result for '" + searchterm + "':"; + } else if (count == 0) { + return "No search results for '" + searchterm + "'."; + } else { + return count + " search results for '" + searchterm + "':"; + } + } + + function formatSearchResult(result, searchterms) { + var teaser = makeTeaser(escapeHTML(result.doc.body), searchterms); + teaser_count++; + + // The ?URL_MARK_PARAM= parameter belongs inbetween the page and the #heading-anchor + var url = doc_urls[result.ref].split("#"); + if (url.length == 1) { // no anchor found + url.push(""); + } + + // encodeURIComponent escapes all chars that could allow an XSS except + // for '. Due to that we also manually replace ' with its url-encoded + // representation (%27). + var searchterms = encodeURIComponent(searchterms.join(" ")).replace(/\'/g, "%27"); + + return '' + result.doc.breadcrumbs + '' + + '' + + teaser + ''; + } + + function makeTeaser(body, searchterms) { + // The strategy is as follows: + // First, assign a value to each word in the document: + // Words that correspond to search terms (stemmer aware): 40 + // Normal words: 2 + // First word in a sentence: 8 + // Then use a sliding window with a constant number of words and count the + // sum of the values of the words within the window. Then use the window that got the + // maximum sum. If there are multiple maximas, then get the last one. + // Enclose the terms in . + var stemmed_searchterms = searchterms.map(function(w) { + return elasticlunr.stemmer(w.toLowerCase()); + }); + var searchterm_weight = 40; + var weighted = []; // contains elements of ["word", weight, index_in_document] + // split in sentences, then words + var sentences = body.toLowerCase().split('. '); + var index = 0; + var value = 0; + var searchterm_found = false; + for (var sentenceindex in sentences) { + var words = sentences[sentenceindex].split(' '); + value = 8; + for (var wordindex in words) { + var word = words[wordindex]; + if (word.length > 0) { + for (var searchtermindex in stemmed_searchterms) { + if (elasticlunr.stemmer(word).startsWith(stemmed_searchterms[searchtermindex])) { + value = searchterm_weight; + searchterm_found = true; + } + }; + weighted.push([word, value, index]); + value = 2; + } + index += word.length; + index += 1; // ' ' or '.' if last word in sentence + }; + index += 1; // because we split at a two-char boundary '. ' + }; + + if (weighted.length == 0) { + return body; + } + + var window_weight = []; + var window_size = Math.min(weighted.length, results_options.teaser_word_count); + + var cur_sum = 0; + for (var wordindex = 0; wordindex < window_size; wordindex++) { + cur_sum += weighted[wordindex][1]; + }; + window_weight.push(cur_sum); + for (var wordindex = 0; wordindex < weighted.length - window_size; wordindex++) { + cur_sum -= weighted[wordindex][1]; + cur_sum += weighted[wordindex + window_size][1]; + window_weight.push(cur_sum); + }; + + if (searchterm_found) { + var max_sum = 0; + var max_sum_window_index = 0; + // backwards + for (var i = window_weight.length - 1; i >= 0; i--) { + if (window_weight[i] > max_sum) { + max_sum = window_weight[i]; + max_sum_window_index = i; + } + }; + } else { + max_sum_window_index = 0; + } + + // add around searchterms + var teaser_split = []; + var index = weighted[max_sum_window_index][2]; + for (var i = max_sum_window_index; i < max_sum_window_index+window_size; i++) { + var word = weighted[i]; + if (index < word[2]) { + // missing text from index to start of `word` + teaser_split.push(body.substring(index, word[2])); + index = word[2]; + } + if (word[1] == searchterm_weight) { + teaser_split.push("") + } + index = word[2] + word[0].length; + teaser_split.push(body.substring(word[2], index)); + if (word[1] == searchterm_weight) { + teaser_split.push("") + } + }; + + return teaser_split.join(''); + } + + function init(config) { + results_options = config.results_options; + search_options = config.search_options; + searchbar_outer = config.searchbar_outer; + doc_urls = config.doc_urls; + searchindex = elasticlunr.Index.load(config.index); + + // Set up events + searchicon.addEventListener('click', function(e) { searchIconClickHandler(); }, false); + searchbar.addEventListener('keyup', function(e) { searchbarKeyUpHandler(); }, false); + document.addEventListener('keydown', function(e) { globalKeyHandler(e); }, false); + // If the user uses the browser buttons, do the same as if a reload happened + window.onpopstate = function(e) { doSearchOrMarkFromUrl(); }; + // Suppress "submit" events so the page doesn't reload when the user presses Enter + document.addEventListener('submit', function(e) { e.preventDefault(); }, false); + + // If reloaded, do the search or mark again, depending on the current url parameters + doSearchOrMarkFromUrl(); + } + + function unfocusSearchbar() { + // hacky, but just focusing a div only works once + var tmp = document.createElement('input'); + tmp.setAttribute('style', 'position: absolute; opacity: 0;'); + searchicon.appendChild(tmp); + tmp.focus(); + tmp.remove(); + } + + // On reload or browser history backwards/forwards events, parse the url and do search or mark + function doSearchOrMarkFromUrl() { + // Check current URL for search request + var url = parseURL(window.location.href); + if (url.params.hasOwnProperty(URL_SEARCH_PARAM) + && url.params[URL_SEARCH_PARAM] != "") { + showSearch(true); + searchbar.value = decodeURIComponent( + (url.params[URL_SEARCH_PARAM]+'').replace(/\+/g, '%20')); + searchbarKeyUpHandler(); // -> doSearch() + } else { + showSearch(false); + } + + if (url.params.hasOwnProperty(URL_MARK_PARAM)) { + var words = decodeURIComponent(url.params[URL_MARK_PARAM]).split(' '); + marker.mark(words, { + exclude: mark_exclude + }); + + var markers = document.querySelectorAll("mark"); + function hide() { + for (var i = 0; i < markers.length; i++) { + markers[i].classList.add("fade-out"); + window.setTimeout(function(e) { marker.unmark(); }, 300); + } + } + for (var i = 0; i < markers.length; i++) { + markers[i].addEventListener('click', hide); + } + } + } + + // Eventhandler for keyevents on `document` + function globalKeyHandler(e) { + if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey || e.target.type === 'textarea' || e.target.type === 'text' || !hasFocus() && /^(?:input|select|textarea)$/i.test(e.target.nodeName)) { return; } + + if (e.keyCode === ESCAPE_KEYCODE) { + e.preventDefault(); + searchbar.classList.remove("active"); + setSearchUrlParameters("", + (searchbar.value.trim() !== "") ? "push" : "replace"); + if (hasFocus()) { + unfocusSearchbar(); + } + showSearch(false); + marker.unmark(); + } else if (!hasFocus() && e.keyCode === SEARCH_HOTKEY_KEYCODE) { + e.preventDefault(); + showSearch(true); + window.scrollTo(0, 0); + searchbar.select(); + } else if (hasFocus() && e.keyCode === DOWN_KEYCODE) { + e.preventDefault(); + unfocusSearchbar(); + searchresults.firstElementChild.classList.add("focus"); + } else if (!hasFocus() && (e.keyCode === DOWN_KEYCODE + || e.keyCode === UP_KEYCODE + || e.keyCode === SELECT_KEYCODE)) { + // not `:focus` because browser does annoying scrolling + var focused = searchresults.querySelector("li.focus"); + if (!focused) return; + e.preventDefault(); + if (e.keyCode === DOWN_KEYCODE) { + var next = focused.nextElementSibling; + if (next) { + focused.classList.remove("focus"); + next.classList.add("focus"); + } + } else if (e.keyCode === UP_KEYCODE) { + focused.classList.remove("focus"); + var prev = focused.previousElementSibling; + if (prev) { + prev.classList.add("focus"); + } else { + searchbar.select(); + } + } else { // SELECT_KEYCODE + window.location.assign(focused.querySelector('a')); + } + } + } + + function showSearch(yes) { + if (yes) { + search_wrap.classList.remove('hidden'); + searchicon.setAttribute('aria-expanded', 'true'); + } else { + search_wrap.classList.add('hidden'); + searchicon.setAttribute('aria-expanded', 'false'); + var results = searchresults.children; + for (var i = 0; i < results.length; i++) { + results[i].classList.remove("focus"); + } + } + } + + function showResults(yes) { + if (yes) { + searchresults_outer.classList.remove('hidden'); + } else { + searchresults_outer.classList.add('hidden'); + } + } + + // Eventhandler for search icon + function searchIconClickHandler() { + if (search_wrap.classList.contains('hidden')) { + showSearch(true); + window.scrollTo(0, 0); + searchbar.select(); + } else { + showSearch(false); + } + } + + // Eventhandler for keyevents while the searchbar is focused + function searchbarKeyUpHandler() { + var searchterm = searchbar.value.trim(); + if (searchterm != "") { + searchbar.classList.add("active"); + doSearch(searchterm); + } else { + searchbar.classList.remove("active"); + showResults(false); + removeChildren(searchresults); + } + + setSearchUrlParameters(searchterm, "push_if_new_search_else_replace"); + + // Remove marks + marker.unmark(); + } + + // Update current url with ?URL_SEARCH_PARAM= parameter, remove ?URL_MARK_PARAM and #heading-anchor . + // `action` can be one of "push", "replace", "push_if_new_search_else_replace" + // and replaces or pushes a new browser history item. + // "push_if_new_search_else_replace" pushes if there is no `?URL_SEARCH_PARAM=abc` yet. + function setSearchUrlParameters(searchterm, action) { + var url = parseURL(window.location.href); + var first_search = ! url.params.hasOwnProperty(URL_SEARCH_PARAM); + if (searchterm != "" || action == "push_if_new_search_else_replace") { + url.params[URL_SEARCH_PARAM] = searchterm; + delete url.params[URL_MARK_PARAM]; + url.hash = ""; + } else { + delete url.params[URL_MARK_PARAM]; + delete url.params[URL_SEARCH_PARAM]; + } + // A new search will also add a new history item, so the user can go back + // to the page prior to searching. A updated search term will only replace + // the url. + if (action == "push" || (action == "push_if_new_search_else_replace" && first_search) ) { + history.pushState({}, document.title, renderURL(url)); + } else if (action == "replace" || (action == "push_if_new_search_else_replace" && !first_search) ) { + history.replaceState({}, document.title, renderURL(url)); + } + } + + function doSearch(searchterm) { + + // Don't search the same twice + if (current_searchterm == searchterm) { return; } + else { current_searchterm = searchterm; } + + if (searchindex == null) { return; } + + // Do the actual search + var results = searchindex.search(searchterm, search_options); + var resultcount = Math.min(results.length, results_options.limit_results); + + // Display search metrics + searchresults_header.innerText = formatSearchMetric(resultcount, searchterm); + + // Clear and insert results + var searchterms = searchterm.split(' '); + removeChildren(searchresults); + for(var i = 0; i < resultcount ; i++){ + var resultElem = document.createElement('li'); + resultElem.innerHTML = formatSearchResult(results[i], searchterms); + searchresults.appendChild(resultElem); + } + + // Display results + showResults(true); + } + + fetch(path_to_root + 'searchindex.json') + .then(response => response.json()) + .then(json => init(json)) + .catch(error => { // Try to load searchindex.js if fetch failed + var script = document.createElement('script'); + script.src = path_to_root + 'searchindex.js'; + script.onload = () => init(window.search); + document.head.appendChild(script); + }); + + // Exported functions + search.hasFocus = hasFocus; +})(window.search); diff --git a/searchindex.js b/searchindex.js new file mode 100644 index 0000000..7a8c033 --- /dev/null +++ b/searchindex.js @@ -0,0 +1 @@ +Object.assign(window.search, {"doc_urls":["introduction.html#rust-宏小册","introduction.html#致谢","introduction.html#版权声明","syntax-extensions.html#语法扩展","syntax-extensions/source-analysis.html#源代码解析方式","syntax-extensions/source-analysis.html#标识化-tokenization","syntax-extensions/source-analysis.html#语法解析-parsing","syntax-extensions/source-analysis.html#标记树-token-trees","syntax-extensions/ast.html#ast-中的宏","syntax-extensions/expansion.html#展开","syntax-extensions/hygiene.html#卫生性","syntax-extensions/debugging.html#调试","decl-macros.html#声明宏","decl-macros/macros-methodical.html#思路介绍","decl-macros/macros-methodical.html#macro_rules","decl-macros/macros-methodical.html#匹配","decl-macros/macros-methodical.html#元变量","decl-macros/macros-methodical.html#反复","decl-macros/macros-methodical.html#元变量表达式","decl-macros/macros-practical.html#实战篇","decl-macros/macros-practical.html#一点背景知识","decl-macros/macros-practical.html#构建过程","decl-macros/macros-practical.html#索引与移位","decl-macros/macros-practical.html#替换","decl-macros/macros-practical.html#保持卫生性","decl-macros/macros-practical.html#导出宏","decl-macros/minutiae.html#细节问题","decl-macros/minutiae/fragment-specifiers.html#片段分类符","decl-macros/minutiae/fragment-specifiers.html#block","decl-macros/minutiae/fragment-specifiers.html#expr","decl-macros/minutiae/fragment-specifiers.html#ident","decl-macros/minutiae/fragment-specifiers.html#item","decl-macros/minutiae/fragment-specifiers.html#lifetime","decl-macros/minutiae/fragment-specifiers.html#literal","decl-macros/minutiae/fragment-specifiers.html#meta","decl-macros/minutiae/fragment-specifiers.html#pat","decl-macros/minutiae/fragment-specifiers.html#pat_param","decl-macros/minutiae/fragment-specifiers.html#path","decl-macros/minutiae/fragment-specifiers.html#stmt","decl-macros/minutiae/fragment-specifiers.html#tt","decl-macros/minutiae/fragment-specifiers.html#ty","decl-macros/minutiae/fragment-specifiers.html#vis","decl-macros/minutiae/metavar-and-expansion.html#再谈元变量与宏展开","decl-macros/minutiae/metavar-and-expansion.html#书写宏规则的顺序","decl-macros/minutiae/metavar-and-expansion.html#片段分类符的跟随限制","decl-macros/minutiae/metavar-and-expansion.html#编译器拒绝模糊的规则","decl-macros/minutiae/metavar-and-expansion.html#不基于标记的代换","decl-macros/minutiae/metavar-expr.html#元变量表达式","decl-macros/minutiae/metavar-expr.html#dollar-dollar-","decl-macros/minutiae/metavar-expr.html#countident-depth","decl-macros/minutiae/metavar-expr.html#indexdepth","decl-macros/minutiae/metavar-expr.html#lengthdepth","decl-macros/minutiae/metavar-expr.html#ignoreident","decl-macros/minutiae/hygiene.html#卫生性","decl-macros/minutiae/hygiene.html#宏是部分卫生的","decl-macros/minutiae/hygiene.html#crate-元变量","decl-macros/minutiae/identifiers.html#非标识符的标识符","decl-macros/minutiae/identifiers.html#self","decl-macros/minutiae/identifiers.html#_","decl-macros/minutiae/debugging.html#调试","decl-macros/minutiae/debugging.html#trace_macros","decl-macros/minutiae/debugging.html#log_syntax","decl-macros/minutiae/debugging.html#macro_railroad-lib","decl-macros/minutiae/scoping.html#作用域","decl-macros/minutiae/scoping.html#文本作用域","decl-macros/minutiae/scoping.html#宏在子模块中可见","decl-macros/minutiae/scoping.html#宏在定义之后可见","decl-macros/minutiae/scoping.html#宏与宏之间顺序无关","decl-macros/minutiae/scoping.html#宏可以被暂时覆盖","decl-macros/minutiae/scoping.html#macro_use-属性","decl-macros/minutiae/scoping.html#当宏放在函数内","decl-macros/minutiae/scoping.html#关于宏声明的位置","decl-macros/minutiae/scoping.html#基于路径的作用域","decl-macros/minutiae/import-export.html#导入导出","decl-macros/minutiae/import-export.html#2015-版本","decl-macros/minutiae/import-export.html#macro_use","decl-macros/minutiae/import-export.html#macro_export","decl-macros/minutiae/import-export.html#2018-版本","decl-macros/macros2.html#声明宏-20","decl-macros/macros2.html#语法","decl-macros/macros2.html#macro-是规范的条目","decl-macros/macros2.html#卫生性","decl-macros/patterns.html#模式","decl-macros/patterns/callbacks.html#回调","decl-macros/patterns/tt-muncher.html#增量式-tt-撕咬机","decl-macros/patterns/tt-muncher.html#性能建议","decl-macros/patterns/internal-rules.html#内用规则","decl-macros/patterns/internal-rules.html#性能建议","decl-macros/patterns/push-down-acc.html#下推累积","decl-macros/patterns/push-down-acc.html#性能建议","decl-macros/patterns/repetition-replacement.html#反复替换","decl-macros/patterns/tt-bundling.html#tt-捆绑","decl-macros/building-blocks.html#构件","decl-macros/building-blocks/ast-coercion.html#ast-强制转换","decl-macros/building-blocks/counting.html#计数","decl-macros/building-blocks/counting.html#反复替换","decl-macros/building-blocks/counting.html#递归","decl-macros/building-blocks/counting.html#切片长度","decl-macros/building-blocks/counting.html#枚举计数","decl-macros/building-blocks/counting.html#bit-twiddling","decl-macros/building-blocks/abacus-counting.html#算盘计数","decl-macros/building-blocks/abacus-counting.html#描述分析","decl-macros/building-blocks/abacus-counting.html#算盘游戏","decl-macros/building-blocks/parsing.html#解析-rust","decl-macros/building-blocks/parsing.html#函数","decl-macros/building-blocks/parsing.html#方法","decl-macros/building-blocks/parsing.html#结构体","decl-macros/building-blocks/parsing.html#枚举体","proc-macros.html#过程宏","proc-macros/methodical.html#思路介绍","proc-macros/methodical.html#过程宏的类型","proc-macros/methodical.html#函数式","proc-macros/methodical.html#属性式","proc-macros/methodical.html#derive-式","proc-macros/methodical/function-like.html#函数式过程宏","proc-macros/methodical/attr.html#属性式过程宏","proc-macros/methodical/derive.html#derive-式过程宏","proc-macros/methodical/derive.html#辅助属性","proc-macros/third-party-crates.html#第三方-crates","proc-macros/third-party-crates.html#proc-macro2","proc-macros/third-party-crates.html#quote","proc-macros/third-party-crates.html#syn","proc-macros/hygiene.html#卫生性和-span","translation_statement.html#翻译说明","translation_statement.html#更新日志","translation_statement.html#202204","translation_statement.html#202106"],"index":{"documentStore":{"docInfo":{"0":{"body":26,"breadcrumbs":1,"title":1},"1":{"body":17,"breadcrumbs":0,"title":0},"10":{"body":57,"breadcrumbs":0,"title":0},"100":{"body":0,"breadcrumbs":0,"title":0},"101":{"body":86,"breadcrumbs":0,"title":0},"102":{"body":105,"breadcrumbs":0,"title":0},"103":{"body":8,"breadcrumbs":1,"title":1},"104":{"body":53,"breadcrumbs":0,"title":0},"105":{"body":3,"breadcrumbs":0,"title":0},"106":{"body":107,"breadcrumbs":0,"title":0},"107":{"body":94,"breadcrumbs":0,"title":0},"108":{"body":4,"breadcrumbs":0,"title":0},"109":{"body":32,"breadcrumbs":0,"title":0},"11":{"body":58,"breadcrumbs":0,"title":0},"110":{"body":5,"breadcrumbs":0,"title":0},"111":{"body":7,"breadcrumbs":0,"title":0},"112":{"body":9,"breadcrumbs":0,"title":0},"113":{"body":16,"breadcrumbs":1,"title":1},"114":{"body":24,"breadcrumbs":0,"title":0},"115":{"body":26,"breadcrumbs":0,"title":0},"116":{"body":32,"breadcrumbs":2,"title":1},"117":{"body":42,"breadcrumbs":1,"title":0},"118":{"body":8,"breadcrumbs":2,"title":1},"119":{"body":35,"breadcrumbs":3,"title":2},"12":{"body":17,"breadcrumbs":0,"title":0},"120":{"body":28,"breadcrumbs":2,"title":1},"121":{"body":30,"breadcrumbs":2,"title":1},"122":{"body":17,"breadcrumbs":2,"title":1},"123":{"body":16,"breadcrumbs":0,"title":0},"124":{"body":0,"breadcrumbs":0,"title":0},"125":{"body":3,"breadcrumbs":1,"title":1},"126":{"body":5,"breadcrumbs":1,"title":1},"13":{"body":1,"breadcrumbs":0,"title":0},"14":{"body":35,"breadcrumbs":1,"title":1},"15":{"body":43,"breadcrumbs":0,"title":0},"16":{"body":70,"breadcrumbs":0,"title":0},"17":{"body":79,"breadcrumbs":0,"title":0},"18":{"body":37,"breadcrumbs":0,"title":0},"19":{"body":3,"breadcrumbs":0,"title":0},"2":{"body":5,"breadcrumbs":0,"title":0},"20":{"body":28,"breadcrumbs":0,"title":0},"21":{"body":296,"breadcrumbs":0,"title":0},"22":{"body":394,"breadcrumbs":0,"title":0},"23":{"body":823,"breadcrumbs":0,"title":0},"24":{"body":300,"breadcrumbs":0,"title":0},"25":{"body":43,"breadcrumbs":0,"title":0},"26":{"body":1,"breadcrumbs":0,"title":0},"27":{"body":31,"breadcrumbs":0,"title":0},"28":{"body":11,"breadcrumbs":1,"title":1},"29":{"body":15,"breadcrumbs":1,"title":1},"3":{"body":7,"breadcrumbs":0,"title":0},"30":{"body":14,"breadcrumbs":1,"title":1},"31":{"body":45,"breadcrumbs":1,"title":1},"32":{"body":14,"breadcrumbs":1,"title":1},"33":{"body":15,"breadcrumbs":1,"title":1},"34":{"body":16,"breadcrumbs":1,"title":1},"35":{"body":21,"breadcrumbs":1,"title":1},"36":{"body":50,"breadcrumbs":1,"title":1},"37":{"body":13,"breadcrumbs":1,"title":1},"38":{"body":97,"breadcrumbs":1,"title":1},"39":{"body":9,"breadcrumbs":1,"title":1},"4":{"body":0,"breadcrumbs":0,"title":0},"40":{"body":16,"breadcrumbs":1,"title":1},"41":{"body":99,"breadcrumbs":1,"title":1},"42":{"body":0,"breadcrumbs":0,"title":0},"43":{"body":10,"breadcrumbs":0,"title":0},"44":{"body":28,"breadcrumbs":0,"title":0},"45":{"body":18,"breadcrumbs":0,"title":0},"46":{"body":74,"breadcrumbs":0,"title":0},"47":{"body":18,"breadcrumbs":0,"title":0},"48":{"body":35,"breadcrumbs":2,"title":2},"49":{"body":50,"breadcrumbs":2,"title":2},"5":{"body":59,"breadcrumbs":1,"title":1},"50":{"body":21,"breadcrumbs":1,"title":1},"51":{"body":30,"breadcrumbs":1,"title":1},"52":{"body":25,"breadcrumbs":1,"title":1},"53":{"body":2,"breadcrumbs":0,"title":0},"54":{"body":54,"breadcrumbs":0,"title":0},"55":{"body":40,"breadcrumbs":1,"title":1},"56":{"body":8,"breadcrumbs":0,"title":0},"57":{"body":182,"breadcrumbs":1,"title":1},"58":{"body":46,"breadcrumbs":1,"title":1},"59":{"body":0,"breadcrumbs":0,"title":0},"6":{"body":22,"breadcrumbs":1,"title":1},"60":{"body":84,"breadcrumbs":1,"title":1},"61":{"body":21,"breadcrumbs":1,"title":1},"62":{"body":7,"breadcrumbs":2,"title":2},"63":{"body":14,"breadcrumbs":0,"title":0},"64":{"body":0,"breadcrumbs":0,"title":0},"65":{"body":16,"breadcrumbs":0,"title":0},"66":{"body":34,"breadcrumbs":0,"title":0},"67":{"body":24,"breadcrumbs":0,"title":0},"68":{"body":33,"breadcrumbs":0,"title":0},"69":{"body":78,"breadcrumbs":1,"title":1},"7":{"body":57,"breadcrumbs":2,"title":2},"70":{"body":31,"breadcrumbs":0,"title":0},"71":{"body":7,"breadcrumbs":0,"title":0},"72":{"body":4,"breadcrumbs":0,"title":0},"73":{"body":6,"breadcrumbs":0,"title":0},"74":{"body":0,"breadcrumbs":1,"title":1},"75":{"body":14,"breadcrumbs":1,"title":1},"76":{"body":74,"breadcrumbs":1,"title":1},"77":{"body":24,"breadcrumbs":1,"title":1},"78":{"body":11,"breadcrumbs":3,"title":1},"79":{"body":48,"breadcrumbs":2,"title":0},"8":{"body":131,"breadcrumbs":2,"title":1},"80":{"body":8,"breadcrumbs":3,"title":1},"81":{"body":39,"breadcrumbs":2,"title":0},"82":{"body":0,"breadcrumbs":0,"title":0},"83":{"body":76,"breadcrumbs":0,"title":0},"84":{"body":61,"breadcrumbs":2,"title":1},"85":{"body":69,"breadcrumbs":1,"title":0},"86":{"body":65,"breadcrumbs":0,"title":0},"87":{"body":1,"breadcrumbs":0,"title":0},"88":{"body":328,"breadcrumbs":0,"title":0},"89":{"body":9,"breadcrumbs":0,"title":0},"9":{"body":78,"breadcrumbs":0,"title":0},"90":{"body":31,"breadcrumbs":0,"title":0},"91":{"body":84,"breadcrumbs":2,"title":1},"92":{"body":2,"breadcrumbs":0,"title":0},"93":{"body":33,"breadcrumbs":2,"title":1},"94":{"body":0,"breadcrumbs":0,"title":0},"95":{"body":29,"breadcrumbs":0,"title":0},"96":{"body":150,"breadcrumbs":0,"title":0},"97":{"body":34,"breadcrumbs":0,"title":0},"98":{"body":31,"breadcrumbs":0,"title":0},"99":{"body":209,"breadcrumbs":2,"title":2}},"docs":{"0":{"body":"注意:这是对 Daniel Keep 撰写的书 的续写,自 2016 年初夏以来,那本书就没再更新。 本书的续写者为 Veykril ,使用 mdBook 工具生成。你可以浏览本书的 英文版本 ,和 github 仓库 。 [1] 这本书尝试提炼出 Rust 社区对 Rust 宏的共识,准确地说,是 通过例子 来讲述宏 [2] 。 因此,欢迎 PR 补充和提 issue。 如果你对某些书中的内容不清楚,或者不理解,别害怕提 issue 来请求澄清那部分。本书的目标是尽可能成为最好的(宏)学习资料。 在我学习 Rust 的时候, Little Book of Rust Macros 原作 通过例子 的方式非常给力地帮助过我理解(声明)宏。很遗憾的是,Rust 语言与宏系统持续改进时,原作者不再更新书籍。 这也是我想尽可能地更新这本书的原因,并且我尽可能地把新发现的事情增加到书中,以帮助新的 Rust 宏学习者理解宏系统 —— 这个让很多人困惑的部分。 这本书认为你应该对 Rust 有基本的了解,它不会解释 Rust 语言特性或者与宏无关的结构,但不会假设你提前掌握宏的知识。 你必须至少阅读和理解了 Rust Book 的前七章 —— 当然,建议你阅读完 Rust Book 的大部分内容。 译者注:我对原作和续作进行了梳理,见 翻译说明 。 译者注:2022 年的中文版随续作更新了过程宏,而声明宏也一直在演进。","breadcrumbs":"简介 » Rust 宏小册","id":"0","title":"Rust 宏小册"},"1":{"body":"非常感谢 Daniel Keep 最初写下这本书。 [3] 感谢对原书提出建议和更正的读者: IcyFoxy、 Rym、 TheMicroWorm、 Yurume、 akavel、 cmr、 eddyb、 ogham 和 snake_case。 译者注:非常感谢 Veykril 不懈地更新此书。感谢 DaseinPhaos 对原作的翻译。此外,本书的右侧 TOC 是由 mdbook-theme 所提供。","breadcrumbs":"简介 » 致谢","id":"1","title":"致谢"},"10":{"body":"卫生性 (hygiene) 是宏的一个重要概念。它描述了宏在其语法上下文中工作的能力:不影响或不受其周围环境的影响。 换句话说,这意味着语法扩展应该可以在任何地方调用,而不会干扰其周围的上下文。 在一个完美的世界里,Rust 中的所有语法扩展都是完全卫生的 (fully hygienic),不幸的是情况并非如此,所以应该注意避免编写不是完全卫生的语法扩展。 我们将在这里深入讨论一般的卫生性概念,这些概念会在 Rust 提供的不同语法扩展的相应的卫生性章节中涉及到。 卫生性主要影响从语法扩展产生的标识符和路径。 简而言之,如果由语法扩展创建的标识符不能被调用该语法扩展的环境访问,那么它对于该标识符是卫生的。 同样,如果语法扩展中使用的标识符不能引用到在语法扩展之外定义的内容,则被认为是卫生的。 注意:这里说的“创建”和“使用”是指该标识所在的位置。 之所以说 struct Foo{} 中的 Foo 或 let foo = …; 中的 foo 是被创建的,是因为在某种角度看,它们在其名字下引入了新的东西。 而之所以说 fn foo(_: Foo) {} 中的 Foo 或 foo + 3 中的 foo 是被使用的,是因为从某种角度看,它们正指向某些已存在的东西。 最好的例子用例子来展示。假设某语法扩展 make_local 展开为 let local = 0;,也就是说,它创建了标识符 local,然后假设有以下代码: macro_rules! make_local { () => { let local = 0; }\n}\nfn main() { make_local!(); assert_eq!(local, 0);\n} 如果 assert_eq!(local, 0); 中的 local 被解析为语法扩展所定义的 local,则语法扩展不是卫生的(至少在 local 这个名称/绑定方面不是卫生的)。 现在假设有某语法扩展 use_local 展开为 local = 42;,也就是说,它使用了标识符 local,然后假设有以下代码: // 注释这段声明宏的定义看看会发生什么\nmacro_rules! use_local { () => { local = 42; }\n}\nfn main() { let mut local = 0; // 取消注释这段声明宏的定义看看会发生什么 // macro_rules! use_local { // () => { local = 42; } // } use_local!();\n} 如果给定调用的语法扩展中的 local 被解析为调用前所定义的 local ,则该语法扩展也不是卫生的。 这简短地介绍了卫生性的一般概念。它将在相应的 macro_rules! 和 proc-macro 章节里进行更深入的解释,并阐述其各自的特有之处。","breadcrumbs":"语法拓展 » 卫生性 » 卫生性","id":"10","title":"卫生性"},"100":{"body":"","breadcrumbs":"声明宏 » 构件 » 计数 » 算盘计数 » 算盘计数","id":"100","title":"算盘计数"},"101":{"body":"临时信息:需要更合适的例子。 该用例采用 Rust 分组机制无法表示的匹配嵌套结构, 实在是过于特殊,因此不适作为例子使用。 注意:此节假设读者已经了解 下推累积 以及 标记树撕咬机 。 macro_rules! abacus { ((- $($moves:tt)*) -> (+ $($count:tt)*)) => { abacus!(($($moves)*) -> ($($count)*)) }; ((- $($moves:tt)*) -> ($($count:tt)*)) => { abacus!(($($moves)*) -> (- $($count)*)) }; ((+ $($moves:tt)*) -> (- $($count:tt)*)) => { abacus!(($($moves)*) -> ($($count)*)) }; ((+ $($moves:tt)*) -> ($($count:tt)*)) => { abacus!(($($moves)*) -> (+ $($count)*)) }; // Check if the final result is zero. (() -> ()) => { true }; (() -> ($($count:tt)+)) => { false };\n} fn main() { let equals_zero = abacus!((++-+-+++--++---++----+) -> ()); assert_eq!(equals_zero, true);\n} 这个例子所用的技巧用在如下情况: 记录的计数会发生变化,且初始值为零或在零附近,且必须支持如下操作: 增加一; 减少一; 与 0 (或任何其它固定的有限值)相比较; 数值 n 将由一组共 n 个相同的特定标记来表示。 对数值的修改操作将采用 下推累积 模式由递归调用完成。 假设所采用的特定标记是 x ,则上述操作可实现为: 增加一:匹配($($count:tt)*)并替换为(x $($count)*)。 减少一:匹配(x $($count:tt)*)并替换为($($count)*)。 与0相比较:匹配()。 与1相比较:匹配(x)。 与2相比较:匹配(x x)。 (依此类推...) 作用于计数值的操作将所选的标记来回摆动,如同算盘摆动算子。 [1] 在这句极度单薄的辩解下,隐藏着选用此名称的 真实 理由: 避免造出又一个名含“标记”的术语。今天就该跟你认识的作者谈谈避免 语义饱和 吧! 公平来讲,本来也可以称它为 “一元计数(unary counting)” 。 在想表示负数的情况下,值 -n 可被表示成 n 个相同的其它标记。 在上例中,值 +n 被表示成 n 个 + 标记,而值 -m 被表示成 m 个 - 标记。 有负数的情况下操作起来稍微复杂一些, 增减操作在当前数值为负时实际上互换了角色。 给定 + 和 - 分别作为正数与负数标记,相应操作的实现将变成: 增加一: 匹配 () 并替换为 (+) 匹配 (- $($count:tt)*) 并替换为 ($($count)*) 匹配 ($($count:tt)+) 并替换为 (+ $($count)+) 减少一: 匹配 () 并替换为 (-) 匹配 (+ $($count:tt)*) 并替换为 ($($count)*) 匹配 ($($count:tt)+) 并替换为 (- $($count)+) 与 0 相比较:匹配 () 与 +1 相比较:匹配 (+) 与 -1 相比较:匹配 (-) 与 +2 相比较:匹配 (++) 与 -2 相比较:匹配 (--) (依此类推...) 注意在顶部的示例中,某些规则被合并到一起了 (举例来说,对 () 及 ($($count:tt)+) 的增加操作被合并为对 ($($count:tt)*) 的增加操作)。 如果想要提取出所计数目的实际值,可再使用普通的 计数宏 。对上例来说,终结规则可换为: macro_rules! abacus { // ... // 下列规则将计数替换成实际值的表达式 (() -> ()) => {0}; (() -> (- $($count:tt)*)) => { - ( count_tts!($( $count_tts:tt )*) ) }; (() -> (+ $($count:tt)*)) => { count_tts!($( $count_tts:tt )*) };\n} // 计数一章任选一个宏\nmacro_rules! count_tts { // ...\n} 仅限此例: 严格来说,想要达到此例的效果,没必要做的这么复杂。 如果你不需要在宏中匹配所计的值,可直接采用重复来更加高效地实现: macro_rules! abacus { (-) => {-1}; (+) => {1}; ($( $moves:tt )*) => { 0 $(+ abacus!($moves))* }\n}","breadcrumbs":"声明宏 » 构件 » 计数 » 算盘计数 » 描述分析","id":"101","title":"描述分析"},"102":{"body":"译者注:这章原作者的表述实在过于啰嗦,但是这个例子的确很有意思。 基于这个例子框架,我给出如下浅显而完整的样例代码(可编辑运行): macro_rules! abacus { ((- $($moves:tt)*) -> (+ $($count:tt)*)) => { { println!(\"{} [-]{} | [+]{}\", \"-+1\", stringify!($($moves)*), stringify!($($count)*)); abacus!(($($moves)*) -> ($($count)*)) } }; ((- $($moves:tt)*) -> ($($count:tt)*)) => { { println!(\"{} [-]{} | - {}\", \"- 2\", stringify!($($moves)*), stringify!($($count)*)); abacus!(($($moves)*) -> (- $($count)*)) } }; ((+ $($moves:tt)*) -> (- $($count:tt)*)) => { { println!(\"{} [+]{} | [-]{}\", \"+-3\", stringify!($($moves)*), stringify!($($count)*)); abacus!(($($moves)*) -> ($($count)*)) } }; ((+ $($moves:tt)*) -> ($($count:tt)*)) => { { println!(\"{} [+]{} | + {}\", \"+ 4\", stringify!($($moves)*), stringify!($($count)*)); abacus!(($($moves)*) -> (+ $($count)*)) } }; (() -> ()) => {0}; (() -> (- $($count:tt)*)) => {{-1 + abacus!(() -> ($($count)*)) }}; (() -> (+ $($count:tt)*)) => {{1 + abacus!(() -> ($($count)*)) }};\n} fn main() { println!(\"算盘游戏:左边与右边异号时抵消;非异号时,把左边的符号转移到右边;左边无符号时,游戏结束,计算右边得分\"); println!(\"图示注解:左右符号消耗情况,分支编号,[消失的符号] 左边情况 | [消失的符号] 右边情况\\n\"); println!(\"计数结果:{}\\n\", abacus!((++-+-+) -> (--+-+-))); println!(\"计数结果:{}\\n\", abacus!((++-+-+) -> (++-+-+))); println!(\"计数结果:{}\\n\", abacus!((---+) -> ())); println!(\"计数结果:{}\\n\", abacus!((++-+-+) -> ())); println!(\"计数结果:{}\\n\", abacus!((++-+-+++--++---++----+) -> ())); // 这是作者给的例子 :)\n} 打印结果: 算盘游戏:左边与右边异号时抵消;非异号时,把左边的符号转移到右边;左边无符号时,游戏结束,计算右边得分\n图示注解:左右符号消耗情况,分支编号,[消失的符号] 左边情况 | [消失的符号] 右边情况 +-3 [+]+ - + - + | [-]- + - + -\n+-3 [+]- + - + | [-]+ - + -\n-+1 [-]+ - + | [+]- + -\n+-3 [+]- + | [-]+ -\n-+1 [-]+ | [+]-\n+-3 [+] | [-]\n计数结果:0 + 4 [+]+ - + - + | + + + - + - +\n+ 4 [+]- + - + | + + + + - + - +\n-+1 [-]+ - + | [+]+ + + - + - +\n+ 4 [+]- + | + + + + - + - +\n-+1 [-]+ | [+]+ + + - + - +\n+ 4 [+] | + + + + - + - +\n计数结果:4 - 2 [-]- - + | - - 2 [-]- + | - -\n- 2 [-]+ | - - -\n+-3 [+] | [-]- -\n计数结果:-2 + 4 [+]+ - + - + | + + 4 [+]- + - + | + +\n-+1 [-]+ - + | [+]+\n+ 4 [+]- + | + +\n-+1 [-]+ | [+]+\n+ 4 [+] | + +\n计数结果:2 + 4 [+]+ - + - + + + - - + + - - - + + - - - - + | + + 4 [+]- + - + + + - - + + - - - + + - - - - + | + +\n-+1 [-]+ - + + + - - + + - - - + + - - - - + | [+]+\n+ 4 [+]- + + + - - + + - - - + + - - - - + | + +\n-+1 [-]+ + + - - + + - - - + + - - - - + | [+]+\n+ 4 [+]+ + - - + + - - - + + - - - - + | + +\n+ 4 [+]+ - - + + - - - + + - - - - + | + + +\n+ 4 [+]- - + + - - - + + - - - - + | + + + +\n-+1 [-]- + + - - - + + - - - - + | [+]+ + +\n-+1 [-]+ + - - - + + - - - - + | [+]+ +\n+ 4 [+]+ - - - + + - - - - + | + + +\n+ 4 [+]- - - + + - - - - + | + + + +\n-+1 [-]- - + + - - - - + | [+]+ + +\n-+1 [-]- + + - - - - + | [+]+ +\n-+1 [-]+ + - - - - + | [+]+\n+ 4 [+]+ - - - - + | + +\n+ 4 [+]- - - - + | + + +\n-+1 [-]- - - + | [+]+ +\n-+1 [-]- - + | [+]+\n-+1 [-]- + | [+]\n- 2 [-]+ | - +-3 [+] | [-]\n计数结果:0","breadcrumbs":"声明宏 » 构件 » 计数 » 算盘计数 » 算盘游戏","id":"102","title":"算盘游戏"},"103":{"body":"在有些情况下解析某些 Rust items 会很有用。 这一章会展示一些能够解析 Rust 中更复杂的 items 的宏。 这些宏目的不是解析整个 items 语法,而是解析通用、有用的部分, 解析的方式也不会太复杂。 也就是说,我们不会涉及解析 泛型 之类的东西。 重点在于宏的匹配方式 (matchers) ;展开的部分 ( Reference 里使用的术语叫做 transcribers ), 仅仅用作例子,不需要特别关心它。","breadcrumbs":"声明宏 » 构件 » 解析 » 解析 Rust","id":"103","title":"解析 Rust"},"104":{"body":"macro_rules! function_item_matcher { ( $( #[$meta:meta] )* // ^~~~attributes~~~~^ $vis:vis fn $name:ident ( $( $arg_name:ident : $arg_ty:ty ),* $(,)? ) // ^~~~~~~~~~~~~~~~argument list!~~~~~~~~~~~~~~^ $( -> $ret_ty:ty )? // ^~~~return type~~~^ { $($tt:tt)* } // ^~~~~body~~~~^ ) => { $( #[$meta] )* $vis fn $name ( $( $arg_name : $arg_ty ),* ) $( -> $ret_ty )? { $($tt)* } }\n} #function_item_matcher!(\n# #[inline]\n# #[cold]\n# pub fn foo(bar: i32, baz: i32, ) -> String {\n# format!(\"{} {}\", bar, baz)\n# }\n#);\n#\n# fn main() {\n# assert_eq!(foo(13, 37), \"13 37\");\n# } 这是一个简单的匹配函数的例子, 传入宏的函数不能包含 unsafe、async、泛型和 where 语句。 如果需要解析这些内容,则最好使用 proc-macro (过程宏) 代替。 这个例子可以检查函数签名,从中生成一些额外的东西, 然后再重新返回 (re-emit) 整个函数。 有点像 Derive 过程宏,虽然功能没那么强大,但是是为函数服务的 ( Derive 不作用于函数)。 理想情况下,我们对参数捕获宁愿使用 pat 分类符,而不是 ident 分类符, 但这里目前不被允许(因为前者的跟随限制,不允许其后使用 : )。 幸好在函数签名里面不常使用模式 ( pat ) ,所以这个例子还不错。","breadcrumbs":"声明宏 » 构件 » 解析 » 函数","id":"104","title":"函数"},"105":{"body":"有时我们想解析方法 (methods),方法就是通过 self 的某种形式指向对象的函数。 这让事情变得棘手多了。 WIP (待完善)","breadcrumbs":"声明宏 » 构件 » 解析 » 方法","id":"105","title":"方法"},"106":{"body":"macro_rules! struct_item_matcher { // Unit-Struct ( $( #[$meta:meta] )* // ^~~~attributes~~~~^ $vis:vis struct $name:ident; ) => { $( #[$meta] )* $vis struct $name; }; // Tuple-Struct ( $( #[$meta:meta] )* // ^~~~attributes~~~~^ $vis:vis struct $name:ident ( $( $( #[$field_meta:meta] )* // ^~~~field attributes~~~~^ $field_vis:vis $field_ty:ty // ^~~~~~a single field~~~~~~^ ),* $(,)? ); ) => { $( #[$meta] )* $vis struct $name ( $( $( #[$field_meta] )* $field_vis $field_ty ),* ); }; // Named-Struct ( $( #[$meta:meta] )* // ^~~~attributes~~~~^ $vis:vis struct $name:ident { $( $( #[$field_meta:meta] )* // ^~~~field attributes~~~!^ $field_vis:vis $field_name:ident : $field_ty:ty // ^~~~~~~~~~~~~~~~~a single field~~~~~~~~~~~~~~~^ ),* $(,)? } ) => { $( #[$meta] )* $vis struct $name { $( $( #[$field_meta] )* $field_vis $field_name : $field_ty ),* } }\n} #struct_item_matcher!(\n# #[allow(dead_code)]\n# #[derive(Copy, Clone)]\n# pub(crate) struct Foo { # pub bar: i32,\n# baz: &'static str,\n# qux: f32\n# }\n#);\n#struct_item_matcher!(\n# #[derive(Copy, Clone)]\n# pub(crate) struct Bar;\n#);\n#struct_item_matcher!(\n# #[derive(Clone)]\n# pub(crate) struct Baz (i32, pub f32, String);\n#);\n#fn main() {\n# let _: Foo = Foo { bar: 42, baz: \"macros can be nice\", qux: 3.14, };\n# let _: Bar = Bar;\n# let _: Baz = Baz(2, 0.1234, String::new());\n#}","breadcrumbs":"声明宏 » 构件 » 解析 » 结构体","id":"106","title":"结构体"},"107":{"body":"解析枚举体比解析结构体更复杂一点,所以会用上 模式 这章讨论的技巧: TT 撕咬机 和 内用规则 。 不是重新构造被解析的枚举体,而是只访问枚举体所有的标记 (tokens), 因为重构枚举体将需要我们再通过 下推累积 临时组合所有已解析的标记 (tokens) 。 macro_rules! enum_item_matcher { // tuple variant (@variant $variant:ident ( $( $( #[$field_meta:meta] )* // ^~~~field attributes~~~~^ $field_vis:vis $field_ty:ty // ^~~~~~a single field~~~~~~^ ),* $(,)? //∨~~rest of input~~∨ ) $(, $($tt:tt)* )? ) => { // process rest of the enum $( enum_item_matcher!(@variant $( $tt )*); )? }; // named variant (@variant $variant:ident { $( $( #[$field_meta:meta] )* // ^~~~field attributes~~~!^ $field_vis:vis $field_name:ident : $field_ty:ty // ^~~~~~~~~~~~~~~~~a single field~~~~~~~~~~~~~~~^ ),* $(,)? //∨~~rest of input~~∨ } $(, $($tt:tt)* )? ) => { // process rest of the enum $( enum_item_matcher!(@variant $( $tt )*); )? }; // unit variant (@variant $variant:ident $(, $($tt:tt)* )? ) => { // process rest of the enum $( enum_item_matcher!(@variant $( $tt )*); )? }; // trailing comma (@variant ,) => {}; // base case (@variant) => {}; // entry point ( $( #[$meta:meta] )* $vis:vis enum $name:ident { $($tt:tt)* } ) => { enum_item_matcher!(@variant $($tt)*); };\n} enum_item_matcher!( #[derive(Copy, Clone)] pub(crate) enum Foo { Bar, Baz, }\n);\nenum_item_matcher!( #[derive(Copy, Clone)] pub(crate) enum Bar { Foo(i32, f32), Bar, Baz(), }\n);\nenum_item_matcher!( #[derive(Clone)] pub(crate) enum Baz {}\n); fn main() {}","breadcrumbs":"声明宏 » 构件 » 解析 » 枚举体","id":"107","title":"枚举体"},"108":{"body":"本章将介绍 Rust 的第二种语法扩展类型:过程宏。 与 声明宏 一样,这一部分也分为 思路 和实战 (WIP) 的两个子章节,前者是更正式的介绍,后者是更注重实践的子章。 文中介绍的许多基本信息都来自于 Rust Reference ,因为目前关于过程宏的大部分知识都在那。 译者注:在翻译(或者说知道)这部分内容之前,我自己也总结了一些学习过程宏的经验,你可以 在这 看到。","breadcrumbs":"过程宏 » 过程宏","id":"108","title":"过程宏"},"109":{"body":"本章将从整体角度解释和介绍过程宏。 与 声明宏 不同,过程宏采用 Rust 函数的形式,接受一个(或两个)标记流并输出一个标记流。 过程宏的核心只是一个从 proc-macro crate type 这种类型的库中所导出的公有函数,因此当编写多个过程宏时,你可以将它们全部放在一个 crate 中。 注意:在使用 Cargo 时,定义一个 proc-macro crate 的方式是将 Cargo.toml 中的 lib.proc-macro 键设置为 true,就像这样 [lib]\nproc-macro = true proc-macro 类型的 crate 会隐式链接到编译器提供的 proc_macro 库, proc_macro 库包含了开发过程宏所需的所有内容,并且它公开了两个最重要的类型: TokenStream :它表示我们所熟知的标记树 Span :它表示源代码的一部分,主要用于错误信息的报告和卫生性,更多信息请阅读 卫生性和 Spans 一章 因为过程宏是存在于 crate 中的函数,所以它们可以像 Rust 项目中的所有其他条目一样使用。 使用过程宏只需要将 proc-macro 类型的 crate 添加到项目的依赖关系图中,并将所需的过程宏引入作用域。 注意:调用过程宏与编译器展开成声明宏是在同一阶段运行,只是过程宏是编译器编译、运行、最后替换或追加的独立的 Rust 程序。","breadcrumbs":"过程宏 » 思路 » 思路介绍","id":"109","title":"思路介绍"},"11":{"body":"rustc 提供了许多工具来调试通用的语法扩展,并且针对声明宏和过程宏分别量身定制的一些更具体的工具。 有时,语法扩展所展开的内容会有问题,因为你通常看不到展开的的代码。幸运的是, rustc 通过不稳定的 -Zunpretty=expanded 参数来提供查看展开代码的功能。假设有以下代码: // Shorthand for initializing a `String`.\nmacro_rules! S { ($e:expr) => {String::from($e)};\n} fn main() { let world = S!(\"World\"); println!(\"Hello, {}!\", world);\n} 使用以下命令编译: rustc +nightly -Zunpretty=expanded hello.rs 生成以下输出(针对格式进行了修改): #![feature(prelude_import)]\n#[prelude_import]\nuse std::prelude::rust_2018::*;\n#[macro_use]\nextern crate std;\n// Shorthand for initializing a `String`.\nmacro_rules! S { ($e : expr) => { String :: from($e) } ; } fn main() { let world = String::from(\"World\"); { ::std::io::_print( ::core::fmt::Arguments::new_v1( &[\"Hello, \", \"!\\n\"], &match (&world,) { (arg0,) => [ ::core::fmt::ArgumentV1::new(arg0, ::core::fmt::Display::fmt) ], } ) ); };\n} 除了 rustc 公开了一些方式帮助调试语法扩展之外,对于这里提到的 -Zunpretty=expanded 选项,由 dtolnay 制作的名为 cargo-expand 的 cargo 插件基本上对它进行了包装,使用起来更加方便。 你也可以使用 playground ,点击右上角的 TOOLS 按钮来展开语法扩展!","breadcrumbs":"语法拓展 » 调试 » 调试","id":"11","title":"调试"},"110":{"body":"过程宏实际上存在三种不同的类型,每种类型的性质都略有不同。 [1] 函数式:实现 $name!$input 功能的宏 属性式:实现 #[$input] 功能的属性 derive 式:实现 #[derive($name)] 功能的属性 译者注:你可以参考我 总结的表","breadcrumbs":"过程宏 » 思路 » 过程宏的类型","id":"110","title":"过程宏的类型"},"111":{"body":"#[proc_macro]\npub fn name(input: TokenStream) -> TokenStream { TokenStream::new()\n}","breadcrumbs":"过程宏 » 思路 » 函数式","id":"111","title":"函数式"},"112":{"body":"#[proc_macro_attribute]\npub fn name(attr: TokenStream, input: TokenStream) -> TokenStream { TokenStream::new()\n}","breadcrumbs":"过程宏 » 思路 » 属性式","id":"112","title":"属性式"},"113":{"body":"#[proc_macro_derive(Name)]\npub fn my_derive(input: TokenStream) -> TokenStream { TokenStream::new()\n} 如上所示,每个函数的基本结构是相同的:一个标记了一个属性的公有函数,这个属性定义了它的过程性宏类型,然后函数返回一个 TokenStream。 注意,返回类型必须是一个 TokenStream [2] 。 过程宏也会失败,它们有两种报告错误的方式: panic:此时编译器会捕获到,然后把它作为来自于宏调用的错误发出 调用 compile_error! 注意:如果过程宏内出现无限循环,编译器会长时间等待(挂起),从而造成使用过程宏的 crate 也编译挂起。 译者注:而且这个 TokenStream 类型必须是 proc_macro 所公开的 TokenStream,通常使用 quote 库构造这种类型。","breadcrumbs":"过程宏 » 思路 » derive 式","id":"113","title":"derive 式"},"114":{"body":"类似函数的过程宏,像声明宏那样被调用,即 makro!(…)。 不过,这类宏是三种宏中最简单的一种。它也是唯一一个在单独看调用形式时,无法与声明宏区分开的宏。 类似函数式过程宏的简单编写框架如下所示: use proc_macro::TokenStream; #[proc_macro]\npub fn tlborm_fn_macro(input: TokenStream) -> TokenStream { input\n} 可以看到,这实际上只是从一个 TokenStream 到另一个 TokenStream 的映射,其中 input 是调用分隔符内的标记。 例如,对于示例调用 foo!(bar),输入标记流将由单独的 bar 标记组成。返回的标记流将替换宏调用。 这种宏类型与声明宏具有相同的放置和展开规则,即宏必须在调用位置上输出正确的标记流。 但是,与声明性宏不同,函式过程宏对其输入没有特定的限制。也就是说,在 再谈元变量与宏展开 一章中列出的片段分类符跟随限制在这里不适用,因为过程宏直接作用于标记,而不是根据片段分类符或类似的东西(比如反复)匹配它们。 话虽如此,很明显,过程宏更强大,因为它们可以任意修改其输入,并生成任何所需的输出,只要输出在 Rust 的语法范围内。 用法示例: use tlborm_proc::tlborm_attribute; fn foo() { tlborm_attribute!(be quick; time is mana);\n}","breadcrumbs":"过程宏 » 思路 » 函数式 » 函数式过程宏","id":"114","title":"函数式过程宏"},"115":{"body":"属性式过程宏定义了可添加到条目的的新外部属性。这种宏通过 #[attr] 或 #[attr(…)] 方式调用,其中 … 是任意标记树。 一个属性式过程宏的简单框架如下所示: use proc_macro::TokenStream; #[proc_macro_attribute]\npub fn tlborm_attribute(input: TokenStream, annotated_item: TokenStream) -> TokenStream { annotated_item\n} 这里需要注意的是,与其他两种过程宏不同,这种宏有两个输入参数,而不是一个。 第一个参数是属性名称后面的带分隔符的标记树,不包括它周围的分隔符。如果只有属性名称(其后不带标记树,比如 #[attr]),则这个参数的值为空。 第二个参数是添加了该过程宏属性的条目,但不包括该过程宏所定义的属性。因为这是一个 active 属性,在传递给过程宏之前,该属性将从条目中剥离出来。 返回的标记流将完全替换带被添加了该属性的条目。注意,不一定替换成单个条目,替换的结果可以是 0 或更多条目。 用法示例: use tlborm_proc::tlborm_attribute; #[tlborm_attribute]\nfn foo() {} #[tlborm_attribute(attributes are pretty handsome)]\nfn bar() {}","breadcrumbs":"过程宏 » 思路 » 属性式 » 属性式过程宏","id":"115","title":"属性式过程宏"},"116":{"body":"derive 式过程宏 [1] 为 derive 属性定义了新的输入。这种宏通过将其名称提供给 derive 属性的输入来调用,例如 #[derive(TlbormDerve)]。 译者注:我通常不喜欢把 derive 翻译出来,因为它就像 trait 这个名称那样具体而明确,一目了然。当然,有时我会简写为 “derive 宏”,你称它“派生宏”也行。 一个 derive 式过程宏的简单框架如下所示: use proc_macro::TokenStream; #[proc_macro_derive(TlbormDerive)]\npub fn tlborm_derive(input: TokenStream) -> TokenStream { TokenStream::new()\n} proc_macro_derive 稍微特殊一些,因为它需要一个额外的标识符,此标识符将成为 derive 宏的实际名称。 输入标记流是添加了 derive 属性的条目,也就是说,它将始终是 enum、struct 或者 union 类型,因为这些是 derive 属性仅可以添加上去的条目。 输出的标记流将被 追加 [2] 到带注释的条目所处的块或模块,所以要求标记流由一组有效条目组成。 译者注:属性宏与 derive 宏的显著区别在于,属性宏生成的标记是完全替换性质,而 derive 宏生成的标记是追加性质。 用法示例: use tlborm_proc::TlbormDerive; #[derive(TlbormDerive)]\nstruct Foo;","breadcrumbs":"过程宏 » 思路 » derive 式 » derive 式过程宏","id":"116","title":"derive 式过程宏"},"117":{"body":"derive 宏又有一点特殊,因为它可以添加仅在条目定义范围内可见的附加属性。 这些属性被称为派生宏辅助属性 ( derive macro helper attributes ) ,并且是惰性的( inert )。 辅助属性的目的是在每个结构体字段或枚举体成员的基础上为 derive 宏提供额外的可定制性。 也就是说这些属性可用于附着在字段或成员上,而且不会对其本身产生影响。 又因为它们是“惰性的”,所以它们不会被剥离,并且对所有宏都可见。 [3] 译者注:根据 Reference,除了属性宏的属性是 active 的,其他属性都是 inert 的。 辅助属性的定义方式是向 proc_macro_derive 属性增加 attributes(helper0, helper1, ..) 参数,该参数可包含用逗号分隔的标识符列表(即辅助属性的名称)。 因此,编写带辅助属性的 derive 宏的简单框架如下所示: use proc_macro::TokenStream; #[proc_macro_derive(TlbormDerive, attributes(tlborm_helper))]\npub fn tlborm_derive(item: TokenStream) -> TokenStream { TokenStream::new()\n} 这就是辅助属性的全部内容。在过程宏中使用(或者说消耗)辅助属性,得检查字段和成员的属性,来判断它们是否具有相应的辅助属性。 如果条目使用了所有 derive 宏都未定义的辅助属性,那么会出现错误,因为编译器会尝试将这个辅助属性解析为普通属性(而且这个属性并不存在)。 用法示例: use tlborm_proc::TlbormDerive; #[derive(TlbormDerive)]\nstruct Foo { #[tlborm_helper] field: u32\n} #[derive(TlbormDerive)]\nenum Bar { #[tlborm_helper] Variant { #[tlborm_helper] field: u32 }\n}","breadcrumbs":"过程宏 » 思路 » derive 式 » 辅助属性","id":"117","title":"辅助属性"},"118":{"body":"注意:编写过程宏并不需要自动链接的 proc_macro crate 之外的 crate。这里列出 crates 只是使编写它们变得更简单、更简洁,同时由于增加了依赖项,可能会增加过程宏的编译时间。 过程宏放在 crate 中,因此它们可以自然地依赖于 crates.io 上或其他来源的 crates。 crates 生态系统已经有一些非常实用、为过程宏量身定做的库,本章将快速介绍这些库,其中大部分将在接下来的章节中用来实现示例。 由于这些只是简单的介绍,如果真的需要使用,建议查看每个库的文档以获得更深入的信息。 译者注:你可以阅读我对以下这几个库的 使用总结 。","breadcrumbs":"过程宏 » 第三方 crates » 第三方 crates","id":"118","title":"第三方 crates"},"119":{"body":"你可能会认为 proc-macro2 是 proc_macro 的继承者,但实际上肯定不对! 这个名字可能有点误导,因为 proc-macro2 实际上只是对 proc_macro 的包装,根据其文档,它用于两个特定目的: 将类似与过程宏的功能带到其他上下文中,如 build.rs 和 main.rs 让过程宏可进行单元测试 由于 proc_macro 只能在 proc-macro 类型的库中使用,所以无法直接使用 proc_macro 库。 始终记住,proc-macro2 模仿 proc_macro 的 api,对后者进行包装,让后者的功能在非 proc-macro 类型的库中也能使用。 因此,建议基于 proc-macro2 来开发过程宏代码的库,而不是基于 proc_macro 构建,因为这将使这些库可以进行单元测试,这也是以下列出的库传入和返回 proc-macro2::TokenStream 的原因。 当需要 proc_macro::TokenStream 时,只需对 proc-macro2::TokenStream 进行 .into() 操作即可获得 proc_macro 的版本,反之亦然。 使用 proc-macro2 的过程宏通常会以别名的形式导入,比如使用 use proc-macro2::TokenStream as TokenStream2 来导入 proc-macro2::TokenStream。","breadcrumbs":"过程宏 » 第三方 crates » proc-macro2","id":"119","title":"proc-macro2"},"12":{"body":"本章将介绍 Rust 的声明宏系统: macro_rules! 。 在这一章中有两种不同的介绍,一个 讲思路 ,另一个 讲实践 。 前者会向你阐述一个完整而详尽的系统如何工作,而后者将涵盖更多的实际例子。 因此, 思路介绍 是为那些只希望声明宏系统作为一个整体得到解释的人而设计的,而 实践介绍 则指导人们通过实现单个宏。 在这两个介绍之后,本章还提供了一些常规且有用的 模式 和 构件 ,用于创建功能丰富的声明宏。 关于声明宏的其他资源: Rust Book 的 宏章节 ,这是一个更平易近人的高级解释 Reference macros-by-example 章节,它更深入而精确地讨论了细节 注意:本书在讨论声明宏时,通常会使用术语 mbe ( M acro- B y- E xample)、 mbe macro 或 macro_rules!。","breadcrumbs":"声明宏 » 声明宏","id":"12","title":"声明宏"},"120":{"body":"quote 主要公开了一个声明宏: quote! 。 这个小小的宏让你轻松创建标记流,使用方法是将实际的源代码写出为 Rust 语法。 同时该宏还允许你将标记直接插入到编写的语法中: 使用 #local 语法进行 插值 ,其中 local 指的是当前作用域中的一个 local。 [1] 使用 #(#local)* 来对实现了 ToTokens 的类型的迭代器进行插值,其工作原理类似于声明宏的反复,因为它们允许在反复中使用分隔符和额外的标记。 译者注:这里的“插值”并不局限于插入“值或者表达式”,可以插入任何符合 Rust 语法的东西,比如标识符、条目、模块等等。 let name = /* 某个标识符 */;\nlet exprs = /* 某个对表达式标记流的迭代器 */;\nlet expanded = quote! { impl SomeTrait for #name { // #name 将插入上述的局部名称 fn some_function(&self) -> usize { #( #exprs )+* // 通过迭代生成表达式 } }\n}; 在准备输出时,quote! 是一个非常有用的工具,它避免了通过逐个插入标记来创建标记流。 注意:如前所述,此 crate 使用 proc_macro2,因此 quote! 将返回 proc-macro2::TokenStream 类型。","breadcrumbs":"过程宏 » 第三方 crates » quote","id":"120","title":"quote"},"121":{"body":"syn 是一个解析库,用于将 Rust 标记流解析为 Rust 源代码的语法树。 它是一个功能非常强大的库,使得解析过程宏输入变得非常容易,而 proc_macro 本身不公开任何类型的解析功能,只公开标记。 由于这个库可能是一个严重的编译依赖项,它大量使用 feature 控制来允许用户根据需要将其功能剪裁得尽可能小。 那么,它能提供什么呢?很多东西。 首先,当启用 full feature 时,它具有对所有标准 Rust 语法节点的定义和从而能够完全解析 Rust 语法。 在启用 derive feature (默认开启)之后,它还提供一个 DeriveInput 类型,该类型封装了传递给 derive 宏输入所有信息。 在启用 parsing 和 proc-macro feature (默认开启)之后,DeriveInput 可以直接与 parse_macro_input! 配合使用,以将标记流解析为所需的类型。 如果 Rust 语法不能解决你的问题,或者说你希望解析自定义的非 Rust 语法,那么这个库还提供了一个通用的[解析 API][parse],主要是以 Parse trait 的形式(这需要 parsing feature,默认启用)。 除此之外,该库公开的类型保留了位置信息和 Span,这让过程宏发出详细的错误消息,指向关注点的宏输入。 由于这又是一个过程宏的库,它利用了 proc-macro2 的类型,因此可能需要转换成 proc_macro 的对应类型。 我对 syn 做了更系统的梳理,你可以 阅读一下 。","breadcrumbs":"过程宏 » 第三方 crates » syn","id":"121","title":"syn"},"122":{"body":"本章讨论过程宏的 卫生性 以及对其进行编码的类型 Span 。 TokenStream 中的每个标记都关联了一个 Span,它其中包含一些附加信息。 正如其文档所述,Span 表示“一个源代码区域,以及宏展开的信息”。 Span 指向原始源代码的一个区域(这对于在正确的位置显示诊断信息很重要),并保持该位置的卫生性。 卫生性主要与标识符有关,因为它允许或禁止表示符对调用外部定义的事物进行引用或者被引用。 卫生性有 3 种(这可以从 Span 类型的构造函数看到): 定义处卫生性 ( definition site ) ( unstable ): 表示宏定义处的 Span。带着这种 Span 的标识符不能引用外部定义的内容(即这种标识符无法使用宏定义之外的内容),或者不能被外部调用的东西引用(即宏定义之外的东西无法使用这种标识符)。这就是所谓的“卫生性”。 混合式卫生性 ( mixed site ):表示宏定义处或者调用处的 Span,具体取决于标识符的类型。声明宏使用这种卫生性,见此 此章 。 调用处卫生性 ( call site ):表示调用处的 Span。此时,标识符表现得就像是直接在调用处编写的一样,也就是说,它们可以自由地使用调用之外定义的内容,也可以从外部引用它们。这就是所谓的“不卫生” (unhygienic)。","breadcrumbs":"过程宏 » 卫生性和 Span » 卫生性和 Span","id":"122","title":"卫生性和 Span"},"123":{"body":"本书是续写版本,续写的版本由 Veykril 撰稿,续作对原作有补充和删改。 原作: repo | 渲染版 原作中文翻译: repo | 渲染版 原作及其翻译渲染版本没有使用 mdbook 构建,而是使用 py 来生成 HTML。 在发布文档和运行样板代码方面诸多不便。 而且由于原作在 2016 年没再更新,其内容基于 Rust 2015 版本, 续写的版本也只是把过时的细节更新至 2018 之后的版本。 我认为这本书在阐述 声明宏 方面搭建了一个很小巧精美的骨架,过程宏的资料比较丰富,而且过程宏生态主要围绕 第三方库 开展。 续作及本翻译渲染版本使用 mdbook 构建: 续作: repo | 渲染版 续作中文翻译: repo | 渲染版 另外,此翻译版本提供的阅读功能: 行间代码块大部分可以点击右上角按钮运行,有些可以 编辑 和运行 (目的是快速而方便地验证读者思考的代码能否编译通过)。 只用于展示说明、或者不适合运行的代码只有复制按钮。 区分能编辑代码块的方法:光标能够在代码块中停留和闪动;有同级竖线;右上角有 undo 图标;选中代码时背景色较浅;看代码块的主题颜色。 每个页面右侧都有本章节的 大纲目录 ,可以点击跳转。 如果大纲目录显示不完整,可以缩小浏览器页面;或者收起左侧的章节目录。 大纲目录仅在电脑网页版生效,移动端网页不会显示。 所有 code 蓝色样式、光标移上去有下划线的内容(普通正文或者行内代码)都是链接,可以跳转。 无链接的行内代码样式是这样的:code 。 翻译专有名词时,给出原英文,因为我认为那些词语是初次阅读英文时的障碍, 所以当读者查阅其他英文资料时,就不会感到陌生了。","breadcrumbs":"翻译说明 » 翻译说明","id":"123","title":"翻译说明"},"124":{"body":"","breadcrumbs":"翻译说明 » 更新日志","id":"124","title":"更新日志"},"125":{"body":"主要补充的部分在于: 元变量表达式 macro 2.0 模式:TT “撕咬机” 之类的“模式”章节添加了“性能建议” 过程宏","breadcrumbs":"翻译说明 » 2022.04","id":"125","title":"2022.04"},"126":{"body":"主要补充的部分在于: 元变量 (metavariables) 片段分类符 (fragment-specifiers) 调试 作用域 导入/导出宏 计数:bit twiddling 译者补充: 算盘游戏 构件:解析","breadcrumbs":"翻译说明 » 2021.06","id":"126","title":"2021.06"},"13":{"body":"这一节会介绍 Rust 的 声明宏系统 ,解释该系统如何作为整体运作。 首先会深入构造语法及其关键部分,然后介绍你至少应该了解的通用信息。","breadcrumbs":"声明宏 » 思路 » 思路介绍","id":"13","title":"思路介绍"},"14":{"body":"有了前述知识,我们终于可以介绍 macro_rules! 了。如前所述,macro_rules! 本身就是一个语法扩展,也就是从技术上说,它并不是 Rust 语法的一部分。它的形式如下: macro_rules! $name { $rule0 ; $rule1 ; // … $ruleN ;\n} 至少得有一条规则 ,而且最后一条规则后面的分号可被省略。规则里你可以使用大/中/小括号: {}、[]、() [1] 。每条“规则”都形如: ($matcher) => {$expansion} 译者注:它们的英文名称有时候很重要,因为如果你不认识英文名称的话,会比较难读懂文档(比如 syn )。braces {}、brackets []、parentheses ()。 分组符号可以是任意一种括号,但处于习惯,在模式匹配 (matcher) 外侧使用小括号、展开 (expansion 也可以叫做 transcriber) 外侧使用大括号。 注意:在规则里选择哪种括号并不会影响宏调用。 而且,实际上,你也可以在调用宏时使用这三种中任意一种括号,只不过使用 { ... } 或者 ( ... ); 的话会有所不同(关注点在于末尾跟随的分号 ; )。有末尾分号的宏调用 总是 会被解析成一个条目 (item)。 如果你好奇的话,macro_rules! 的调用将被展开成什么?答案是:空 (nothing)。至少,在 AST 中它被展开为空。它所影响的是编译器内部的结构,以将该宏注册 (register) 进去。因此,技术上讲你可以在任何一个空展开合法的位置使用 macro_rules!。 译者注:这里提到两种情况,定义声明宏和使用(或者说调用)声明宏。而且,在括号的选取上: 定义的规则不关心 ($matcher) => {$expansion} 中的 外层 括号类型,但 matcher 和 expansion 之内的括号属于匹配和展开的内容,所以它们内部使用什么括号取决于你需要什么语法。 假如使用 m! 这个宏,如果该宏展开成条目,则必须使用 m! { ... } 或者 m!( ... );; 如果该宏展开成表达式,你可以使用 m! { ... } 或者 m!( ... ) 或者 m![ ... ]。 实际上,定义宏的括号遵循习惯就好,而使用宏的括号用错的话,只需仔细阅读编译器给你的错误信息,和以上第 2 点,就知道怎么改了。","breadcrumbs":"声明宏 » 思路 » macro_rules!","id":"14","title":"macro_rules!"},"15":{"body":"当一个宏被调用时,macro_rules! 解释器将按照声明顺序一一检查规则。 对每条规则,它都将尝试将输入标记树的内容与该规则的 matcher 进行匹配。某个 matcher [2] 必须与输入 完全 匹配才被认为是一次匹配。 译者注:为了简单起见,我不翻译 matcher 这个术语,它指的是被匹配的部分,也就是声明宏规则的前半段。 如果输入与某个 matcher 相匹配,则该调用将替换成相应的展开内容 (expansion) ;否则,将尝试匹配下条规则。 如果所有规则均匹配失败,则宏展开失败并报错。 最简单的例子是空 matcher: macro_rules! four { () => { 1 + 3 };\n} 当且仅当匹配到空的输入时,匹配成功,即 four!()、four![] 或 four!{} 三种方式调用是匹配成功的 。 注意所用的分组标记并 不需要 匹配定义时采用的分组标记,因为实际上分组标记并未传给调用。 也就是说,你可以通过 four![] 调用上述宏,此调用仍将被视作匹配成功。只有输入的内容才会被纳入匹配考量范围。 matcher 中也可以包含字面上 [3] 的标记树,这些标记树必须被完全匹配。将整个对应标记树在相应位置写下即可。 比如,要匹配标记序列 4 fn ['spang \"whammo\"] @_@ ,我们可以这样写: macro_rules! gibberish { (4 fn ['spang \"whammo\"] @_@) => {...};\n} 使用 gibberish!(4 fn ['spang \"whammo\"] @_@]) 即可成功匹配和调用。 你能写出什么标记树,就可以使用什么标记树。 译者注:这里不是指 Rust 的“字面值”,而是指不考虑含义的标记,比如这个例子中 fn 和 []都不是 Rust 的 literal 标记 ( token ),而是 keyword 和 delimiter 标记,或者从下面谈到的元变量角度看,它们 可以 被 ident 或者 tt 分类符捕获。","breadcrumbs":"声明宏 » 思路 » 匹配","id":"15","title":"匹配"},"16":{"body":"matcher 还可以包含捕获 (captures)。即基于某种通用语法类别来匹配输入,并将结果捕获到元变量 (metavariable) 中,然后将替换元变量到输出。 捕获的书写方式是:先写美元符号 $,然后跟一个标识符,然后是冒号 :,最后是捕获方式,比如 $e:expr。 捕获方式又被称作“片段分类符” ( fragment-specifier ),必须是以下一种: block :一个块(比如一块语句或者由大括号包围的一个表达式) expr :一个表达式 (expression) ident :一个标识符 (identifier),包括关键字 (keywords) item :一个条目(比如函数、结构体、模块、impl 块) lifetime :一个生命周期注解(比如 'foo、'static) literal :一个字面值(比如 \"Hello World!\"、3.14、'🦀') meta :一个元信息(比如 #[...] 和 #![...] 属性内部的东西) pat :一个模式 (pattern) path :一条路径(比如 foo、::std::mem::replace、transmute::<_, int>) stmt :一条语句 (statement) tt :单棵标记树 ty :一个类型 vis :一个可能为空的可视标识符(比如 pub、pub(in crate)) 关于片段分类符更深入的描述请阅读本书的 片段分类符 一章。 比如以下声明宏捕获一个表达式输入到元变量 $e: macro_rules! one_expression { ($e:expr) => {...};\n} 元变量对 Rust 编译器的解析器产生影响,而解析器也会确保元变量总是被“正确无误”地解析。 expr 元变量总是捕获完整且符合 Rust 编译版本的表达式。 你可以在有限的情况下同时结合字面上的标记树和元变量。(见 Metavariables and Expansion Redux 一节) 当元变量已经在 matcher 中确定之后,你只需要写 $name 就能引用元变量。比如: macro_rules! times_five { ($e:expr) => { 5 * $e };\n} 元变量被替换成完整的 AST 节点,这很像宏展开。这也意味着被 $e 捕获的任何标记序列都会被解析成单个完整的表达式。 你也可以一个 matcher 中捕获多个元变量: macro_rules! multiply_add { ($a:expr, $b:expr, $c:expr) => { $a * ($b + $c) };\n} 然后在 expansion 中使用任意次数的元变量: macro_rules! discard { ($e:expr) => {};\n}\nmacro_rules! repeat { ($e:expr) => { $e; $e; $e; };\n} 有一个特殊的元变量叫做 $crate ,它用来指代当前 crate 。","breadcrumbs":"声明宏 » 思路 » 元变量","id":"16","title":"元变量"},"17":{"body":"matcher 可以有反复捕获 (repetition),这使得匹配一连串标记 (token) 成为可能。反复捕获的一般形式为 $ ( ... ) sep rep。 $ 是字面上的美元符号标记 ( ... ) 是被反复匹配的模式,由小括号包围。 sep 是 可选 的分隔标记。它不能是括号或者反复操作符 rep。常用例子有 , 和 ; 。 rep 是 必须 的重复操作符。当前可以是: ?:表示最多一次重复,所以此时不能前跟分隔标记。 *:表示零次或多次重复。 +:表示一次或多次重复。 反复捕获中可以包含任意其他的有效 matcher,比如字面上的标记树、元变量以及任意嵌套的反复捕获。 在 expansion 中,使用被反复捕获的内容时,也采用相同的语法。而且被反复捕获的元变量只能存在于反复语法内。 举例来说,下面这个宏将每一个元素转换成字符串:它先匹配零或多个由逗号分隔的表达式,并分别将它们构造成 Vec 的表达式。 macro_rules! vec_strs { ( // 开始反复捕获 $( // 每个反复必须包含一个表达式 $element:expr ) // 由逗号分隔 , // 0 或多次 * ) => { // 在这个块内用大括号括起来,然后在里面写多条语句 { let mut v = Vec::new(); // 开始反复捕获 $( // 每个反复会展开成下面表达式,其中 $element 被换成相应被捕获的表达式 v.push(format!(\"{}\", $element)); )* v } };\n} fn main() { let s = vec_strs![1, \"a\", true, 3.14159f32]; assert_eq!(s, &[\"1\", \"a\", \"true\", \"3.14159\"]);\n} 你可以在一个反复语句里面使用多次和多个元变量,只要这些元变量以相同的次数重复。所以下面的宏代码正常运行: macro_rules! repeat_two { ($($i:ident)*, $($i2:ident)*) => { $( let $i: (); let $i2: (); )* }\n} fn main () { repeat_two!( a b c d e f, u v w x y z );\n} 但是这下面的不能运行: # macro_rules! repeat_two {\n# ($($i:ident)*, $($i2:ident)*) => {\n# $( let $i: (); let $i2: (); )*\n# }\n# } fn main() { repeat_two!( a b c d e f, x y z );\n} 运行报以下错误: error: meta-variable `i` repeats 6 times, but `i2` repeats 3 times --> src/main.rs:6:10 |\n6 | $( let $i: (); let $i2: (); )* | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^","breadcrumbs":"声明宏 » 思路 » 反复","id":"17","title":"反复"},"18":{"body":"RFC : rfcs#1584 Tracking Issue : rust#83527 Feature : #![feature(macro_metavar_expr)] transcriber [4] 可以包含所谓的元变量表达 (metavariable expressions)。 元变量表达式为 transcriber 提供了关于元变量的信息 —— 这些信息是不容易获得的。 目前除了 $$ 表达式外,它们的一般形式都是 $ { op(...) }:即除了 $$ 以外的所有元变量表达式都涉及反复。 可以使用以下表达式(其中 ident 是所绑定的元变量的名称,而 depth 是整型字面值): ${count(ident)}:最里层反复 $ident 的总次数,相当于 ${count(ident, 0)} ${count(ident,depth)}:第 depth 层反复 $ident 的次数 ${index()}:最里层反复的当前反复的索引,相当于 ${index(0)} ${index(depth)}:在第 depth 层处当前反复的索引,向外计数 ${length()}:最里层反复的重复次数,相当于 ${length(0)} ${length(depth)}:在第 depth 层反复的次数,向外计数 ${ignore(ident)}:绑定 $ident 进行重复,并展开成空 $$:展开为单个 $,这会有效地转义 $ 标记,因此它不会被展开(转写) 即 expansion,指展开的部分,是每条声明宏规则的后半段。 想了解完整的定义语法,可以参考 Rust Reference 书的 Macros By Example 一章。","breadcrumbs":"声明宏 » 思路 » 元变量表达式","id":"18","title":"元变量表达式"},"19":{"body":"本章节将通过一个相对简单、实际的例子来介绍 Rust 的宏系统。 我们不会试图解释整个宏系统错综复杂的构造; 而是试图让读者能够舒适地了解宏的书写方式,以及为何如斯。 在 Rust Book 中也有专门一章 讲解宏 ( 中文版 ), 同样提供了高层面的讲解。 此外,本书也有一章 更富条理的介绍 ,旨在详细阐释宏系统。 译者注:建议初学者跟着文章思路一步步走下去, 从看懂文字说明和样例代码开始,能够运行的代码块运行一遍,看看效果。 把样例代码复制出来跟着文章的说明依次更改。哪一步没跟上,就点右上角的展开按钮; 或者复制按钮,获取未隐藏的代码。","breadcrumbs":"声明宏 » 实战 » 实战篇","id":"19","title":"实战篇"},"2":{"body":"这本书沿袭了原作的版权声明,因此具有 CC BY-SA 4.0 和 MIT license 的双重许可。","breadcrumbs":"简介 » 版权声明","id":"2","title":"版权声明"},"20":{"body":"注意:别慌!我们通篇只会涉及到下面这一点点数学。如果想直接看重点,本小节可被安全跳过。 所谓“递推 (recurrence) 关系”是指这样一个序列, 其中的每个值都由先前的一个或多个值决定, 并最终由一个或多个初始值完全决定。 举例来说, Fibonacci 数列 可被定义为如下关系: \\[ F_{n} = 0, 1, ..., F_{n-1} + F_{n-2}\\] 即序列的前两个数分别为 0 和 1,而第 3 个则为 \\( F_{0} + F_{1} = 0 + 1 = 1\\),第 4 个则为 \\( F_{1} + F_{2} = 1 + 1 = 2\\) ,依此类推。 由于这列值可以永远持续下去,定义一个 fibonacci 的求值函数略显困难。 显然,返回一整列值并不实际。 我们真正需要的,应是某种具有惰求值性质的东西——只在必要的时候才进行运算求值。 在 Rust 中,这样的需求表明,是 Iterator 派上用场的时候了。 实现迭代器并不十分困难,但比较繁琐: 你得自定义一个类型,弄明白该在其中存储什么,然后为它实现 Iterator trait。 其实,递推关系足够简单; 几乎所有的递推关系都可被抽象出来,变成一小段由宏驱动的代码生成机制。 好了,说得已经足够多了,让我们开始干活吧。","breadcrumbs":"声明宏 » 实战 » 一点背景知识","id":"20","title":"一点背景知识"},"21":{"body":"通常来说,在编写新宏时,我所做的第一件事,是决定宏调用的形式。 在我们当前所讨论的情况下,我的初次尝试是这样: let fib = recurrence![a[n] = 0, 1, ..., a[n-1] + a[n-2]]; for e in fib.take(10) { println!(\"{}\", e) } 以此为基点,我们可以向宏的定义迈出第一步, 即便在此时我们尚不了解该宏的展开部分究竟是什么样子。 此步骤的用处在于,如果在此处无法明确如何解析输入语法, 那就可能意味着,整个宏的构思需要改变。 macro_rules! recurrence { ( a[n] = $($inits:expr),+ , ... , $recur:expr ) => { /* ... */ };\n}\n# fn main() {} 假设你并不熟悉相应的语法,让我来解释。 上述代码块使用 macro_rules! 系统定义了一个宏,称为 recurrence! 。 此宏仅包含一条解析规则,它规定,宏的输入必须依次匹配: 一段字面标记序列,a [ n ] = ; 一段 重复 的序列($( ... )),其内元素由,分隔,允许重复一或多次( + ); 重复的内容允许: 一个有效的 表达式 ,它将被捕获至 元变量 inits ($inits:expr) 又一段字面标记序列 , ... ,; 一个有效的 表达式 ,将被捕获至 元变量 recur ($recur:expr)。 最后,规则表明,如果输入被成功匹配,则对该宏的调用将被标记序列 /* ... */ 替换。 值得注意的是,inits,如它命名采用的复数形式所暗示的, 实际上包含所有成功匹配进此重复的表达式,而不仅是第一或最后一个。 不仅如此,它们将被捕获成一个序列,而不是把它们不可逆地拼接在一起。 作为练习,我们将采用上面提及的输入,并研究它被处理的过程。 由 ⌂ 标出的“位置”将揭示下一个需要被匹配的句法模式。 注意在某些情况下,下一个可用元素可能存在多个。 Input 表示所有尚未被消耗的标记。 inits 和 recur 分别表示其对应绑定的内容。 Position Input inits recur a[n] = $($inits:expr),+ , ... , $recur:expr ⌂ a[n] = 0, 1, ..., a[n-1] + a[n-2] a[n] = $($inits:expr),+ , ... , $recur:expr ⌂ [n] = 0, 1, ..., a[n-1] + a[n-2] a[n] = $($inits:expr),+ , ... , $recur:expr ⌂ n] = 0, 1, ..., a[n-1] + a[n-2] a[n] = $($inits:expr),+ , ... , $recur:expr ⌂ ] = 0, 1, ..., a[n-1] + a[n-2] a[n] = $($inits:expr),+ , ... , $recur:expr ⌂ = 0, 1, ..., a[n-1] + a[n-2] a[n] = $($inits:expr),+ , ... , $recur:expr ⌂ 0, 1, ..., a[n-1] + a[n-2] a[n] = $($inits:expr),+ , ... , $recur:expr ⌂ 0, 1, ..., a[n-1] + a[n-2] a[n] = $($inits:expr),+ , ... , $recur:expr ⌂ ⌂ , 1, ..., a[n-1] + a[n-2] 0 注意: 这有两个 `⌂` ,因为下个输入标记既能匹配 重复元素间的分隔符逗号,也能匹配 标志重复结束的逗号。宏系统将同时追踪这两种可能,直到决定具体选择为止。 a[n] = $($inits:expr),+ , ... , $recur:expr ⌂ ⌂ 1, ..., a[n-1] + a[n-2] 0 a[n] = $($inits:expr),+ , ... , $recur:expr ⌂ ⌂ , ..., a[n-1] + a[n-2] 0, 1 注意:第一个被划掉的记号表明, 基于上个被消耗的标记,宏系统排除了一项先前存在的可能。 a[n] = $($inits:expr),+ , ... , $recur:expr ⌂ ..., a[n-1] + a[n-2] 0, 1 a[n] = $($inits:expr),+ , ... , $recur:expr ⌂ , a[n-1] + a[n-2] 0, 1 a[n] = $($inits:expr),+ , ... , $recur:expr ⌂ a[n-1] + a[n-2] 0, 1 a[n] = $($inits:expr),+ , ... , $recur:expr ⌂ 0, 1 a[n-1] + a[n-2] 注意:这一步表明,类似 $recur:expr 的绑定将消耗一个完整的表达式。 究竟什么算是一个完整的表达式,将由编译器决定。 稍后我们会谈到语言其它部分的类似行为。 从此表中得到的最关键收获在于,宏系统会依次“尝试”将提供给它的每个标记当作输入, 然后与提供给它的每条规则进行匹配。我们稍后还将谈回到这一“尝试”。 接下来我们开始写 宏调用完全展开后的形态。 我们想要的结构类似: let fib = { struct Recurrence { mem: [u64; 2], pos: usize, } 这就是我们实际使用的迭代器类型。 其中, mem 负责存储最后计算得到的两个斐波那契值, 以保证递推计算能够顺利进行; pos 则负责记录当前的 n 的值。 附注:此处选用 u64 是因为,对斐波那契数列来说,它已经“足够”了。 先不必担心它是否适用于其它数列,我们会提到这一点的。 impl Iterator for Recurrence { type Item = u64; #[inline] fn next(&mut self) -> Option { if self.pos < 2 { let next_val = self.mem[self.pos]; self.pos += 1; Some(next_val) 我们需要这个 if 分支来返回序列的初始值,没什么技巧。 } else { let a = /* something */; let n = self.pos; let next_val = a[n-1] + a[n-2]; self.mem.TODO_shuffle_down_and_append(next_val); self.pos += 1; Some(next_val) } } } 这段稍微难办一点。 对于具体如何定义 a ,我们稍后再提。 TODO_shuffle_down_and_append 的真面目也将留到稍后揭晓; 我们想让它做到:将 next_val 放至数组末尾, 并将数组中剩下的元素依次前移一格,最后丢掉原先的首元素。 Recurrence { mem: [0, 1], pos: 0 }\n}; for e in fib.take(10) { println!(\"{}\", e) } 最后,我们返回一个该结构的实例。 在随后的代码中,我们将用它来进行迭代。 综上所述,完整的展开应该如下: let fib = { struct Recurrence { mem: [u64; 2], pos: usize, } impl Iterator for Recurrence { type Item = u64; #[inline] fn next(&mut self) -> Option { if self.pos < 2 { let next_val = self.mem[self.pos]; self.pos += 1; Some(next_val) } else { let a = /* something */; let n = self.pos; let next_val = (a[n-1] + a[n-2]); self.mem.TODO_shuffle_down_and_append(next_val.clone()); self.pos += 1; Some(next_val) } } } Recurrence { mem: [0, 1], pos: 0 }\n}; for e in fib.take(10) { println!(\"{}\", e) } 附注:的确,这样做的确意味着每次调用该宏时,我们都会重新定义并实现一个 Recurrence 结构。 如果 #[inline] 属性应用得当,在最终编译出的二进制文件中,大部分冗余都将被优化掉。 在写展开部分的过程中时常检查,也是一个有效的技巧。 如果在过程中发现,展开中的某些内容需要根据调用的不同发生改变, 但这些内容并未被我们的宏语法定义囊括; 那就要去考虑,应该怎样去引入它们。 在此示例中,我们先前用过一次 u64 ,但调用者想要的类型不一定是它; 然而我们的宏语法并没有提供其它选择。因此,我们可以做一些修改。 macro_rules! recurrence { ( a[n]: $sty:ty = $($inits:expr),+ , ... , $recur:expr ) => { /* ... */ };\n} /*\nlet fib = recurrence![a[n]: u64 = 0, 1, ..., a[n-1] + a[n-2]]; for e in fib.take(10) { println!(\"{}\", e) }\n*/\n# fn main() {} 我们加入了一个新的 元变量 sty,它应捕获一个类型 (type) 。 附注:如果你不清楚在捕获冒号之后的部分,那可是几种语法匹配候选项之一。 最常用的包括 item、expr 和 ty。 完整的解释参考 元变量 。 还要注意一点:为方便语言的未来发展,对于跟在某些特定的匹配之后的标记,编译器施加了一些限制。 这种情况常在试图匹配至表达式 (expression) 或语句 (statement) 时出现: 它们后面仅允许跟进 =>、, 和 ; 这些标记之一。 完整清单可在 片段分类符的跟随限制 找到。","breadcrumbs":"声明宏 » 实战 » 构建过程","id":"21","title":"构建过程"},"22":{"body":"在此节中我们将略去一些实际上与宏的联系不太紧密的内容。 这节的目标是,让用户可以通过索引 a 来访问数列中先前的值。 a 应该如同一个滑动窗口 (sliding window), 让我们得以持续访问数列中最近几个(在本例中,两个)值。 通过采用封装类型,我们可以轻易地做到这点: struct IndexOffset<'a> { slice: &'a [u64; 2], offset: usize,\n} impl<'a> Index for IndexOffset<'a> { type Output = u64; #[inline(always)] fn index<'b>(&'b self, index: usize) -> &'b u64 { use std::num::Wrapping; let index = Wrapping(index); let offset = Wrapping(self.offset); let window = Wrapping(2); let real_index = index - offset + window; &self.slice[real_index.0] }\n} 附注:对于新接触 Rust 的人来说,生命周期的概念经常需要一番思考。 我们给出一些简单的解释:'a 和 'b 是生命周期注解, 它们被用于追踪引用一直有效(引用:即一个指向某些数据的借用指针)。 在此例中, IndexOffset 借用了一个指向迭代器数据的引用, 因此,它需要记录该引用能被保持有效的时长,记录的内容正是 'a。 我们用到 'b,是因为 Index::index 函数(下标句法正是通过此函数实现的) 的一个参数也需要生命周期。 'a 和 'b 不一定在所有情况下都相同。 我们并没有显式地声明 'a 和 'b 之间有任何联系,但借用检查器 (borrow checker) 总会确保内存安全性不被意外破坏。 a 的定义将随之变为: let a = IndexOffset { slice: &self.mem, offset: n }; 如何处理 TODO_shuffle_down_and_append 是我们现在剩下的唯一问题了。 我没能在标准库中寻得可以直接使用的方法,但自己造一个出来并不难。 { use std::mem::swap; let mut swap_tmp = next_val; for i in (0..2).rev() { swap(&mut swap_tmp, &mut self.mem[i]); }\n} 它把新值替换至数组末尾,并把其他值向前移动一位。 附注:采用这种做法,将使得我们的代码可同时被用于不可拷贝 (non-copyable) 的类型。 至此,最终起作用的代码将是(可直接在代码块编辑,或者点击右上的运行按钮看看): macro_rules! recurrence { ( a[n]: $sty:ty = $($inits:expr),+ , ... , $recur:expr ) => { /* ... */ };\n} fn main() { /* let fib = recurrence![a[n]: u64 = 0, 1, ..., a[n-1] + a[n-2]]; for e in fib.take(10) { println!(\"{}\", e) } */ let fib = { use std::ops::Index; struct Recurrence { mem: [u64; 2], pos: usize, } struct IndexOffset<'a> { slice: &'a [u64; 2], offset: usize, } impl<'a> Index for IndexOffset<'a> { type Output = u64; #[inline(always)] fn index<'b>(&'b self, index: usize) -> &'b u64 { use std::num::Wrapping; let index = Wrapping(index); let offset = Wrapping(self.offset); let window = Wrapping(2); let real_index = index - offset + window; &self.slice[real_index.0] } } impl Iterator for Recurrence { type Item = u64; #[inline] fn next(&mut self) -> Option { if self.pos < 2 { let next_val = self.mem[self.pos]; self.pos += 1; Some(next_val) } else { let next_val = { let n = self.pos; let a = IndexOffset { slice: &self.mem, offset: n }; (a[n-1] + a[n-2]) }; { use std::mem::swap; let mut swap_tmp = next_val; for i in (0..2).rev() { swap(&mut swap_tmp, &mut self.mem[i]); } } self.pos += 1; Some(next_val) } } } Recurrence { mem: [0, 1], pos: 0 } }; for e in fib.take(10) { println!(\"{}\", e) }\n} 注意我们改变了 n 与 a 的声明顺序, 同时将它们(与递推表达式一起)用一个新区块包裹了起来。 改变声明顺序的理由很明显,因为 n 得在 a 前被定义才能被 a 使用。 而包裹的理由则是:如果不这么做,借用引用 &self.mem 会阻止随后的 swap 操作 (在某物仍存在其它别名时,无法对其进行改变)。 包裹区块将确保 &self.mem 产生的借用在彼时失效。 顺带一提,将交换 mem 的代码包进区块里的唯一原因, 是为了缩减 std::mem::swap 的可用范畴,以保持代码整洁。 如果我们直接拿这段代码来跑,会顺利得到结果: 0\n1\n1\n2\n3\n5\n8\n13\n21\n34 现在,让我们把这段代码复制粘贴进宏的展开部分, 并把它们原本所在的位置换成一次宏调用。这样我们得到: macro_rules! recurrence { ( a[n]: $sty:ty = $($inits:expr),+ , ... , $recur:expr ) => { { /* What follows here is *literally* the code from before, cut and pasted into a new position. No other changes have been made. */ use std::ops::Index; struct Recurrence { mem: [u64; 2], pos: usize, } struct IndexOffset<'a> { slice: &'a [u64; 2], offset: usize, } impl<'a> Index for IndexOffset<'a> { type Output = u64; #[inline(always)] fn index<'b>(&'b self, index: usize) -> &'b u64 { use std::num::Wrapping; let index = Wrapping(index); let offset = Wrapping(self.offset); let window = Wrapping(2); let real_index = index - offset + window; &self.slice[real_index.0] } } impl Iterator for Recurrence { type Item = u64; #[inline] fn next(&mut self) -> Option { if self.pos < 2 { let next_val = self.mem[self.pos]; self.pos += 1; Some(next_val) } else { let next_val = { let n = self.pos; let a = IndexOffset { slice: &self.mem, offset: n }; (a[n-1] + a[n-2]) }; { use std::mem::swap; let mut swap_tmp = next_val; for i in (0..2).rev() { swap(&mut swap_tmp, &mut self.mem[i]); } } self.pos += 1; Some(next_val) } } } Recurrence { mem: [0, 1], pos: 0 } } };\n} fn main() { let fib = recurrence![a[n]: u64 = 0, 1, ..., a[n-1] + a[n-2]]; for e in fib.take(10) { println!(\"{}\", e) }\n} 显然,宏的捕获尚未被用到,但这点很容易修改。 不过,如果尝试编译上述代码,rustc 会中止,并显示: error: local ambiguity: multiple parsing options: built-in NTs expr ('inits') or 1 other option. --> src/main.rs:75:45 |\n75 | let fib = recurrence![a[n]: u64 = 0, 1, ..., a[n-1] + a[n-2]]; | 这里我们撞上了 macro_rules! 的一处的跟随限制。 问题出在那第二个逗号上。 当在展开过程中遇见它时,编译器无法决定是该将它解析成 inits 中的又一个表达式, 还是解析成 ... 。很遗憾,它不够聪明,没办法意识到 ... 不是一个有效的表达式,所以它选择了放弃。 理论上 来说,上述代码应该能奏效,但当前它并不能。 附注:有关宏系统如何解读我们的规则,我之前的确撒了点小谎(指没有从“正确”的规则开始)。 通常来说,宏系统确实应当如我前述的那般运作,但在这里它没有。 macro_rules! 的机制,由此看来,是存在一些小毛病的; 我们不得不记得偶尔去做一些微调,好让它我们期许的那般运作。 在本例中,问题有两个。 宏系统不清楚各式各样的语法元素(如表达式)可由什么样的东西构成, 或不能由什么样的东西构成;那是语法解析器的工作。 在试图捕获复合语法元素(如表达式)的过程中,它如果不是 100% 地确定 应该进行捕获的话,那么无法实行捕获。 换句话说,宏系统可以向语法解析器发出请求,让解析器试图把某段输入当作表达式来进行解析; 但此间无论语法解析器遇见任何问题,都将中止整个进程以示回应。 目前,宏系统处理这种窘境的唯一方式,就是对任何可能产生此类问题的情境加以禁止。 好的一面在于,对于这摊子情况,没有任何人乐于看到。 所以关键词 macro 早已被预留,以备未来更加严密的宏系统使用。 只是直到那天来临之前,我们还是该怎么做就怎么做,乖乖遵循跟随限制 :) 还好,修正方案也很简单:从宏句法中去掉逗号即可。 出于平衡考量,我们将移除 ... 双边的逗号: macro_rules! recurrence { ( a[n]: $sty:ty = $($inits:expr),+ ... $recur:expr ) => { };\n} 可惜作者在这里给的方案早在 1.14 版不再编译通过(由原版翻译者所言), 而且至今(1.54 版,笔者所试)这里也无法使用 ... 编译, 因为 expr 之后只能跟随 =>、,、; 之一 以下续作者修改为编译通过的版本。 我们现在运气不好,因为我们想象出来的语法不会以这种方式工作, 所以让我们只选择一个看起来最适合的。 关键点在于分隔符不被识别,而通常使用 , 或者 ; 作为分隔符, 所以可以把原来的 , ... ,替换成 ; 或者 ; ... ;。 macro_rules! recurrence { ( a[n]: $sty:ty = $($inits:expr),+ ; ... ; $recur:expr ) => {\n// ^~~~~~^ changed /* ... */\n# // Cheat :D\n# (vec![0u64, 1, 2, 3, 5, 8, 13, 21, 34]).into_iter() };\n} fn main() { let fib = recurrence![a[n]: u64 = 0, 1; ...; a[n-1] + a[n-2]];\n// ^~~~~^ changed for e in fib.take(10) { println!(\"{}\", e) }\n} 成功!现在,我们该将捕获部分捕获到的内容替代进展开部分中了。","breadcrumbs":"声明宏 » 实战 » 索引与移位","id":"22","title":"索引与移位"},"23":{"body":"在宏中替换你捕获到的内容非常简单, 通过 $sty:ty 捕获到的内容可用 $sty 来替换。 好,让我们换掉那些 u64 吧: macro_rules! recurrence { ( a[n]: $sty:ty = $($inits:expr),+ ; ... ; $recur:expr ) => { { use std::ops::Index; struct Recurrence { mem: [$sty; 2],\n// ^~~~ changed pos: usize, } struct IndexOffset<'a> { slice: &'a [$sty; 2],\n// ^~~~ changed offset: usize, } impl<'a> Index for IndexOffset<'a> { type Output = $sty;\n// ^~~~ changed #[inline(always)] fn index<'b>(&'b self, index: usize) -> &'b $sty {\n// ^~~~ changed use std::num::Wrapping; let index = Wrapping(index); let offset = Wrapping(self.offset); let window = Wrapping(2); let real_index = index - offset + window; &self.slice[real_index.0] } } impl Iterator for Recurrence { type Item = $sty;\n// ^~~~ changed #[inline] fn next(&mut self) -> Option<$sty> {\n// ^~~~ changed /* ... */\n# if self.pos < 2 {\n# let next_val = self.mem[self.pos];\n# self.pos += 1;\n# Some(next_val)\n# } else {\n# let next_val = {\n# let n = self.pos;\n# let a = IndexOffset { slice: &self.mem, offset: n };\n# (a[n-1] + a[n-2])\n# };\n# # {\n# use std::mem::swap;\n# # let mut swap_tmp = next_val;\n# for i in (0..2).rev() {\n# swap(&mut swap_tmp, &mut self.mem[i]);\n# }\n# }\n# # self.pos += 1;\n# Some(next_val)\n# } } } Recurrence { mem: [0, 1], pos: 0 } } };\n} fn main() { let fib = recurrence![a[n]: u64 = 0, 1; ...; a[n-1] + a[n-2]]; for e in fib.take(10) { println!(\"{}\", e) }\n} 现在让我们来尝试更难的:如何将 inits 同时转变为字面值 [0, 1] 以及数组类型 [$sty; 2] 。首先我们试试: Recurrence { mem: [$($inits),+], pos: 0 }\n// ^~~~~~~~~~~ changed 此段代码与捕获的效果正好相反:将 inits 捕得的内容排列开来,总共有 1 或多次, 每条内容之间用逗号分隔。展开的结果与期望一致,我们得到标记序列:0, 1。 不过,通过 inits 转换出字面值 2 需要一些技巧。 没有直接可行的方法,但我们可以通过另一个宏做到。我们一步一步来。 macro_rules! count_exprs { /* ??? */\n# () => {}\n}\n# fn main() {} 先写显而易见的情况:未给表达式时,我们期望count_exprs展开为字面值0。 macro_rules! count_exprs { () => (0);\n// ^~~~~~~~~~ added\n}\n# fn main() {\n# const _0: usize = count_exprs!();\n# assert_eq!(_0, 0);\n# } 附注:你可能已经注意到了,这里的展开部分我用的是括号而非花括号。 macro_rules! 其实不关心你用的是什么,只要它成对匹配即可:( )、{ } 或 [ ]。 实际上,宏本身的匹配符(即紧跟宏名称后的匹配符)、 语法规则外的匹配符及相应展开部分外的匹配符都可以替换。 调用宏时的括号也可被替换,但有些限制:当宏被以 {...} 或 (...); 形式调用时, 它总是会被解析为一个条目(item,比如 struct 或 fn 声明)。 在函数体内部时,这一特征很重要,它将消除“解析成表达式”和“解析成语句”之间的歧义。 有一个表达式的情况该怎么办?应该展开为字面值 1 。 macro_rules! count_exprs { () => (0); ($e:expr) => (1);\n// ^~~~~~~~~~~~~~~~~ added\n}\n# fn main() {\n# const _0: usize = count_exprs!();\n# const _1: usize = count_exprs!(x);\n# assert_eq!(_0, 0);\n# assert_eq!(_1, 1);\n# } 两个呢? macro_rules! count_exprs { () => (0); ($e:expr) => (1); ($e0:expr, $e1:expr) => (2);\n// ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ added\n}\n# fn main() {\n# const _0: usize = count_exprs!();\n# const _1: usize = count_exprs!(x);\n# const _2: usize = count_exprs!(x, y);\n# assert_eq!(_0, 0);\n# assert_eq!(_1, 1);\n# assert_eq!(_2, 2);\n# } 通过递归调用重新表达,我们可将扩展部分“精简”出来: macro_rules! count_exprs { () => (0); ($e:expr) => (1); ($e0:expr, $e1:expr) => (1 + count_exprs!($e1));\n// ^~~~~~~~~~~~~~~~~~~~~ changed\n}\n# fn main() {\n# const _0: usize = count_exprs!();\n# const _1: usize = count_exprs!(x);\n# const _2: usize = count_exprs!(x, y);\n# assert_eq!(_0, 0);\n# assert_eq!(_1, 1);\n# assert_eq!(_2, 2);\n# } 这样做可行是因为,Rust可将 1 + 1 合并成一个常量。 那么,三种表达式的情况呢? macro_rules! count_exprs { () => (0); ($e:expr) => (1); ($e0:expr, $e1:expr) => (1 + count_exprs!($e1)); ($e0:expr, $e1:expr, $e2:expr) => (1 + count_exprs!($e1, $e2));\n// ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ added\n}\n# fn main() {\n# const _0: usize = count_exprs!();\n# const _1: usize = count_exprs!(x);\n# const _2: usize = count_exprs!(x, y);\n# const _3: usize = count_exprs!(x, y, z);\n# assert_eq!(_0, 0);\n# assert_eq!(_1, 1);\n# assert_eq!(_2, 2);\n# assert_eq!(_3, 3);\n# } 附注:你可能会想,我们是否能翻转这些规则的排列顺序。 在此情境下,可以。但在有些情况下,宏系统可能会对此挑剔。 如果你发现自己有一个包含多项规则的宏系统老是报错,或给出期望外的结果; 但你发誓它应该能用,试着调换一下规则的排序吧。 我们希望你现在已经能看出规律。 通过匹配至一个表达式加上 0 或多个表达式并展开成 1+a,我们可以减少规则列表的数目: macro_rules! count_exprs { () => (0); ($head:expr) => (1); ($head:expr, $($tail:expr),*) => (1 + count_exprs!($($tail),*));\n// ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ changed\n}\n# fn main() {\n# const _0: usize = count_exprs!();\n# const _1: usize = count_exprs!(x);\n# const _2: usize = count_exprs!(x, y);\n# const _3: usize = count_exprs!(x, y, z);\n# assert_eq!(_0, 0);\n# assert_eq!(_1, 1);\n# assert_eq!(_2, 2);\n# assert_eq!(_3, 3);\n# } 仅对此例: 这段代码并非计数仅有或其最好的方法。 若有兴趣,稍后可以研读 计数 一节。 有此工具后,我们可再次修改 recurrence ,确定 mem 所需的大小。 // added:\nmacro_rules! count_exprs { () => (0); ($head:expr) => (1); ($head:expr, $($tail:expr),*) => (1 + count_exprs!($($tail),*));\n} macro_rules! recurrence { ( a[n]: $sty:ty = $($inits:expr),+ ; ... ; $recur:expr ) => { { use std::ops::Index; const MEM_SIZE: usize = count_exprs!($($inits),+);\n// ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ added struct Recurrence { mem: [$sty; MEM_SIZE],\n// ^~~~~~~~ changed pos: usize, } struct IndexOffset<'a> { slice: &'a [$sty; MEM_SIZE],\n// ^~~~~~~~ changed offset: usize, } impl<'a> Index for IndexOffset<'a> { type Output = $sty; #[inline(always)] fn index<'b>(&'b self, index: usize) -> &'b $sty { use std::num::Wrapping; let index = Wrapping(index); let offset = Wrapping(self.offset); let window = Wrapping(MEM_SIZE);\n// ^~~~~~~~ changed let real_index = index - offset + window; &self.slice[real_index.0] } } impl Iterator for Recurrence { type Item = $sty; #[inline] fn next(&mut self) -> Option<$sty> { if self.pos < MEM_SIZE {\n// ^~~~~~~~ changed let next_val = self.mem[self.pos]; self.pos += 1; Some(next_val) } else { let next_val = { let n = self.pos; let a = IndexOffset { slice: &self.mem, offset: n }; (a[n-1] + a[n-2]) }; { use std::mem::swap; let mut swap_tmp = next_val; for i in (0..MEM_SIZE).rev() {\n// ^~~~~~~~ changed swap(&mut swap_tmp, &mut self.mem[i]); } } self.pos += 1; Some(next_val) } } } Recurrence { mem: [$($inits),+], pos: 0 } } };\n}\n/* ... */\n# # fn main() {\n# let fib = recurrence![a[n]: u64 = 0, 1; ...; a[n-1] + a[n-2]];\n# # for e in fib.take(10) { println!(\"{}\", e) }\n# } 完成之后,我们开始替换最后的 recur 表达式。 # macro_rules! count_exprs {\n# () => (0);\n# ($head:expr $(, $tail:expr)*) => (1 + count_exprs!($($tail),*));\n# }\n# macro_rules! recurrence {\n# ( a[n]: $sty:ty = $($inits:expr),+ ; ... ; $recur:expr ) => {\n# {\n# use std::ops::Index;\n#\n# const MEM_SIZE: usize = count_exprs!($($inits),+);\n# struct Recurrence {\n# mem: [$sty; MEM_SIZE],\n# pos: usize,\n# }\n# struct IndexOffset<'a> {\n# slice: &'a [$sty; MEM_SIZE],\n# offset: usize,\n# }\n# impl<'a> Index for IndexOffset<'a> {\n# type Output = $sty;\n#\n# #[inline(always)]\n# fn index<'b>(&'b self, index: usize) -> &'b $sty {\n# use std::num::Wrapping;\n# # let index = Wrapping(index);\n# let offset = Wrapping(self.offset);\n# let window = Wrapping(MEM_SIZE);\n# # let real_index = index - offset + window;\n# &self.slice[real_index.0]\n# }\n# }\n# impl Iterator for Recurrence {\n# type Item = $sty;\n/* ... */ #[inline] fn next(&mut self) -> Option { if self.pos < MEM_SIZE { let next_val = self.mem[self.pos]; self.pos += 1; Some(next_val) } else { let next_val = { let n = self.pos; let a = IndexOffset { slice: &self.mem, offset: n }; $recur\n// ^~~~~~ changed }; { use std::mem::swap; let mut swap_tmp = next_val; for i in (0..MEM_SIZE).rev() { swap(&mut swap_tmp, &mut self.mem[i]); } } self.pos += 1; Some(next_val) } }\n/* ... */\n# }\n# Recurrence { mem: [$($inits),+], pos: 0 }\n# }\n# };\n# }\n# fn main() {\n# let fib = recurrence![a[n]: u64 = 1, 1; ...; a[n-1] + a[n-2]];\n# for e in fib.take(10) { println!(\"{}\", e) }\n# } 现在试图编译的话... error[E0425]: cannot find value `a` in this scope --> src/main.rs:68:50 |\n68 | let fib = recurrence![a[n]: u64 = 1, 1; ...; a[n-1] + a[n-2]]; | ^ not found in this scope error[E0425]: cannot find value `n` in this scope --> src/main.rs:68:52 |\n68 | let fib = recurrence![a[n]: u64 = 1, 1; ...; a[n-1] + a[n-2]]; | ^ not found in this scope error[E0425]: cannot find value `a` in this scope --> src/main.rs:68:59 |\n68 | let fib = recurrence![a[n]: u64 = 1, 1; ...; a[n-1] + a[n-2]]; | ^ not found in this scope error[E0425]: cannot find value `n` in this scope --> src/main.rs:68:61 |\n68 | let fib = recurrence![a[n]: u64 = 1, 1; ...; a[n-1] + a[n-2]]; | ^ not found in this scope ...等等,什么情况?这没道理...让我们看看宏究竟展开成了什么样子。 $ rustc -Z unstable-options --pretty expanded recurrence.rs 参数 --pretty expanded 将促使 rustc 展开宏,并将输出的 AST 再重转为源代码。 此选项当前被认定为是 unstable ,因此我们还要添加 -Z unstable-options 。 输出的信息(经过整理格式后)如下;特别留意 $recur 被替换掉的位置: #![feature(no_std)]\n#![no_std]\n#[prelude_import]\nuse std::prelude::v1::*;\n#[macro_use]\nextern crate std as std;\nfn main() { let fib = { use std::ops::Index; const MEM_SIZE: usize = 1 + 1; struct Recurrence { mem: [u64; MEM_SIZE], pos: usize, } struct IndexOffset<'a> { slice: &'a [u64; MEM_SIZE], offset: usize, } impl <'a> Index for IndexOffset<'a> { type Output = u64; #[inline(always)] fn index<'b>(&'b self, index: usize) -> &'b u64 { use std::num::Wrapping; let index = Wrapping(index); let offset = Wrapping(self.offset); let window = Wrapping(MEM_SIZE); let real_index = index - offset + window; &self.slice[real_index.0] } } impl Iterator for Recurrence { type Item = u64; #[inline] fn next(&mut self) -> Option { if self.pos < MEM_SIZE { let next_val = self.mem[self.pos]; self.pos += 1; Some(next_val) } else { let next_val = { let n = self.pos; let a = IndexOffset{slice: &self.mem, offset: n,}; a[n - 1] + a[n - 2] }; { use std::mem::swap; let mut swap_tmp = next_val; { let result = match ::std::iter::IntoIterator::into_iter((0..MEM_SIZE).rev()) { mut iter => loop { match ::std::iter::Iterator::next(&mut iter) { ::std::option::Option::Some(i) => { swap(&mut swap_tmp, &mut self.mem[i]); } ::std::option::Option::None => break, } }, }; result } } self.pos += 1; Some(next_val) } } } Recurrence{mem: [0, 1], pos: 0,} }; { let result = match ::std::iter::IntoIterator::into_iter(fib.take(10)) { mut iter => loop { match ::std::iter::Iterator::next(&mut iter) { ::std::option::Option::Some(e) => { ::std::io::_print(::std::fmt::Arguments::new_v1( { static __STATIC_FMTSTR: &'static [&'static str] = &[\"\", \"\\n\"]; __STATIC_FMTSTR }, &match (&e,) { (__arg0,) => [::std::fmt::ArgumentV1::new(__arg0, ::std::fmt::Display::fmt)], } )) } ::std::option::Option::None => break, } }, }; result }\n} 呃..这看起来完全合法! 如果我们加上几条 #![feature(...)] 属性,并把它送去给一个 nightly 版本的 rustc, 甚至真能通过编译...究竟什么情况?! 附注:上述代码无法通过非 nightly 版 rustc 编译。 这是因为, println! 宏的展开结果依赖于编译器内部的细节,这些细节尚未被公开稳定化。","breadcrumbs":"声明宏 » 实战 » 替换","id":"23","title":"替换"},"24":{"body":"这儿的问题在于,Rust 宏中的标识符具有卫生性。 这就是说,出自不同上下文的标识符不可能发生冲突。 作为演示,举个简单的例子。 macro_rules! using_a { ($e:expr) => { { let a = 42i; $e } }\n} let four = using_a!(a / 10);\n# fn main() {} 此宏接受一个表达式,然后把它包进一个定义了变量 a 的代码块里。 我们随后用它绕个弯子来求 4 。 这个例子中实际上存在 2 种句法上下文,但我们看不见它们。 为了帮助说明,我们给每个上下文都上一种不同的颜色。 我们从未展开的代码开始上色,此时仅看得见一种上下文: macro_rules! using_a { ($e:expr) => { { let a = 42; $e } }\n} let four = using_a!(a / 10); 现在,展开宏调用。 let four = { let a = 42; a / 10\n}; 可以看到,在宏中定义的a 与调用所提供的a处于不同的上下文中。 因此,虽然它们的字母表示一致,编译器仍将它们视作完全不同的标识符。 宏的这一特性需要格外留意:它们可能会产出无法通过编译的 AST; 但同样的代码,手写或通过 --pretty expanded 转印出来则能够通过编译。 解决方案是,采用合适的句法上下文来捕获标识符。我们沿用上例,并作修改: macro_rules! using_a { ($a:ident, $e:expr) => { { let $a = 42; $e } }\n} let four = using_a!(a, a / 10); 现在它将展开为: let four = { let a = 42; a / 10\n}; 上下文现在匹配了,编译通过。 我们的 recurrence! 宏也可被如此调整: 显式地捕获a与n即可。调整后我们得到: macro_rules! count_exprs { () => (0); ($head:expr) => (1); ($head:expr, $($tail:expr),*) => (1 + count_exprs!($($tail),*));\n} macro_rules! recurrence { ( $seq:ident [ $ind:ident ]: $sty:ty = $($inits:expr),+ ; ... ; $recur:expr ) => {\n// ^~~~~~~~~~ ^~~~~~~~~~ changed { use std::ops::Index; const MEM_SIZE: usize = count_exprs!($($inits),+); struct Recurrence { mem: [$sty; MEM_SIZE], pos: usize, } struct IndexOffset<'a> { slice: &'a [$sty; MEM_SIZE], offset: usize, } impl<'a> Index for IndexOffset<'a> { type Output = $sty; #[inline(always)] fn index<'b>(&'b self, index: usize) -> &'b $sty { use std::num::Wrapping; let index = Wrapping(index); let offset = Wrapping(self.offset); let window = Wrapping(MEM_SIZE); let real_index = index - offset + window; &self.slice[real_index.0] } } impl Iterator for Recurrence { type Item = $sty; #[inline] fn next(&mut self) -> Option<$sty> { if self.pos < MEM_SIZE { let next_val = self.mem[self.pos]; self.pos += 1; Some(next_val) } else { let next_val = { let $ind = self.pos;\n// ^~~~ changed let $seq = IndexOffset { slice: &self.mem, offset: $ind };\n// ^~~~ changed $recur }; { use std::mem::swap; let mut swap_tmp = next_val; for i in (0..MEM_SIZE).rev() { swap(&mut swap_tmp, &mut self.mem[i]); } } self.pos += 1; Some(next_val) } } } Recurrence { mem: [$($inits),+], pos: 0 } } };\n} fn main() { let fib = recurrence![a[n]: u64 = 0, 1; ...; a[n-1] + a[n-2]]; for e in fib.take(10) { println!(\"{}\", e) }\n} 通过编译了!接下来,我们试试别的数列。 # macro_rules! count_exprs {\n# () => (0);\n# ($head:expr) => (1);\n# ($head:expr, $($tail:expr),*) => (1 + count_exprs!($($tail),*));\n# }\n# # macro_rules! recurrence {\n# ( $seq:ident [ $ind:ident ]: $sty:ty = $($inits:expr),+ ; ... ; $recur:expr ) => {\n# {\n# use std::ops::Index;\n# # const MEM_SIZE: usize = count_exprs!($($inits),+);\n# # struct Recurrence {\n# mem: [$sty; MEM_SIZE],\n# pos: usize,\n# }\n# # struct IndexOffset<'a> {\n# slice: &'a [$sty; MEM_SIZE],\n# offset: usize,\n# }\n# # impl<'a> Index for IndexOffset<'a> {\n# type Output = $sty;\n# # #[inline(always)]\n# fn index<'b>(&'b self, index: usize) -> &'b $sty {\n# use std::num::Wrapping;\n# # let index = Wrapping(index);\n# let offset = Wrapping(self.offset);\n# let window = Wrapping(MEM_SIZE);\n# # let real_index = index - offset + window;\n# &self.slice[real_index.0]\n# }\n# }\n# # impl Iterator for Recurrence {\n# type Item = $sty;\n# # #[inline]\n# fn next(&mut self) -> Option<$sty> {\n# if self.pos < MEM_SIZE {\n# let next_val = self.mem[self.pos];\n# self.pos += 1;\n# Some(next_val)\n# } else {\n# let next_val = {\n# let $ind = self.pos;\n# let $seq = IndexOffset { slice: &self.mem, offset: $ind };\n# $recur\n# };\n# # {\n# use std::mem::swap;\n# # let mut swap_tmp = next_val;\n# for i in (0..MEM_SIZE).rev() {\n# swap(&mut swap_tmp, &mut self.mem[i]);\n# }\n# }\n# # self.pos += 1;\n# Some(next_val)\n# }\n# }\n# }\n# # Recurrence { mem: [$($inits),+], pos: 0 }\n# }\n# };\n# }\n# # fn main() {\nfor e in recurrence!(f[i]: f64 = 1.0; ...; f[i-1] * i as f64).take(10) { println!(\"{}\", e)\n}\n# } 运行上述代码得到: 1\n1\n2\n6\n24\n120\n720\n5040\n40320\n362880 成功!","breadcrumbs":"声明宏 » 实战 » 保持卫生性","id":"24","title":"保持卫生性"},"25":{"body":"译者注: 导出宏 这部分内容由译者所补充。 这个例子的代码是放在 bin crate 中运行的,如果把 宏 的代码放在 lib crate, main 函数放在 bin crate,那么需要做一点更改。(即使它们都处于同一个 package 下) 假设 recurrence! 和其依赖的 count_exprs! 被定义在 macs lib crate, 根据 导入/导出宏#2018 版本 小节。 首先你得把这两个宏导出,否则使用 macs lib 的 crate 会找不到宏: #[macro_export]\nmacro_rules! count_exprs { /* */ } #[macro_export]\nmacro_rules! recurrence { /* */ } 其次,你需要在 recurrence! 中引入 count_exprs!,使用: // --snippet-- #[macro_export]\nmacro_rules! recurrence { ( $seq:ident [ $ind:ident ]: $sty:ty = $($inits:expr),+ ; ... ; $recur:expr ) => { { use std::ops::Index; use $crate::count_exprs; // 导入 const MEM_SIZE: usize = count_exprs!($($inits),+); // --snippet--","breadcrumbs":"声明宏 » 实战 » 导出宏","id":"25","title":"导出宏"},"26":{"body":"本节将介绍 macro_rules! 宏系统的一些细枝末节。你至少应该 记住 有这些东西存在。","breadcrumbs":"声明宏 » 细节 » 细节问题","id":"26","title":"细节问题"},"27":{"body":"正如在 思路 一章看到的,截至 1.60 版本, Rust 已有 14 个片段分类符 (Fragment Specifiers,以下简称分类符) [1] 。 这一节会更深入地探讨他们之中的细节,每次都会展示几个匹配的例子。 注意:除了 ident、lifetime 和 tt 分类符之外,其余的分类符在匹配后生成的 AST 是不清楚的 (opaque),这使得在之后的宏调用时不可能检查 (inspect) 捕获的结果。 [2] block expr ident item lifetime literal meta pat pat_param path stmt tt ty vis 最新内容可参考 Reference 的 Metavariables 一节。 推荐通过 rust quiz #9 来理解这句话。","breadcrumbs":"声明宏 » 细节 » 片段分类符 » 片段分类符","id":"27","title":"片段分类符"},"28":{"body":"block 分类符只匹配 block 表达式 。 块 (block) 由 { 开始,接着是一些语句,最后是可选的表达式,然后以 } 结束。 块的类型要么是最后的值表达式类型,要么是 () 类型。 macro_rules! blocks { ($($block:block)*) => ();\n} blocks! { {} { let zig; } { 2 }\n}\nfn main() {}","breadcrumbs":"声明宏 » 细节 » 片段分类符 » block","id":"28","title":"block"},"29":{"body":"expr 分类符用于匹配任何形式的表达式 ( expression )。 (如果把 Rust 视为面向表达式的语言,那么它有很多种表达式。) macro_rules! expressions { ($($expr:expr)*) => ();\n} expressions! { \"literal\" funcall() future.await break 'foo bar\n}\nfn main() {}","breadcrumbs":"声明宏 » 细节 » 片段分类符 » expr","id":"29","title":"expr"},"3":{"body":"在讨论 Rust 的不同宏系统之前,有必要讨论一下构建它们的一般机制:语法扩展 。 要理解这一点,我们必须首先讨论编译器如何处理 Rust 源代码,以及构建用户自定义的宏和过程宏所基于的一般机制。 注意 :本书将从现在开始,讨论 Rust 的所有不同宏类型时,使用术语“语法扩展” (syntax extension),以减少与即将发布的声明宏 2.0 提案的可能存在的混淆,该提案使用了 macro 关键字。","breadcrumbs":"语法拓展 » 语法扩展","id":"3","title":"语法扩展"},"30":{"body":"ident 分类符用于匹配任何形式的标识符 ( identifier ) 或者关键字。 。 macro_rules! idents { ($($ident:ident)*) => ();\n} idents! { // _ <- `_` 不是标识符,而是一种模式 foo async O_________O _____O_____\n}\nfn main() {}","breadcrumbs":"声明宏 » 细节 » 片段分类符 » ident","id":"30","title":"ident"},"31":{"body":"item 分类符只匹配 Rust 的 item 的 定义 (definitions) , 不会匹配指向 item 的标识符 (identifiers)。例子: macro_rules! items { ($($item:item)*) => ();\n} items! { struct Foo; enum Bar { Baz } impl Foo {} /*...*/\n}\nfn main() {} item 是在编译时完全确定的,通常在程序执行期间保持固定,并且可以驻留在只读存储器中。具体指: modules extern crate declarations use declarations function definitions type definitions struct definitions enumeration definitions union definitions constant items static items trait definitions implementations extern blocks","breadcrumbs":"声明宏 » 细节 » 片段分类符 » item","id":"31","title":"item"},"32":{"body":"lifetime 分类符用于匹配生命周期注解或者标签 ( lifetime or label )。 它与 ident 很像,但是 lifetime 会匹配到前缀 '' 。 macro_rules! lifetimes { ($($lifetime:lifetime)*) => ();\n} lifetimes! { 'static 'shiv '_\n}\nfn main() {}","breadcrumbs":"声明宏 » 细节 » 片段分类符 » lifetime","id":"32","title":"lifetime"},"33":{"body":"literal 分类符用于匹配字面表达式 ( literal expression )。 macro_rules! literals { ($($literal:literal)*) => ();\n} literals! { -1 \"hello world\" 2.3 b'b' true\n}\nfn main() {}","breadcrumbs":"声明宏 » 细节 » 片段分类符 » literal","id":"33","title":"literal"},"34":{"body":"meta 分类符用于匹配属性 ( attribute ), 准确地说是属性里面的内容。通常你会在 #[$meta:meta] 或 #![$meta:meta] 模式匹配中 看到这个分类符。 macro_rules! metas { ($($meta:meta)*) => ();\n} metas! { ASimplePath super::man path = \"home\" foo(bar)\n}\nfn main() {} 针对文档注释简单说一句: 文档注释其实是具有 #[doc=\"…\"] 形式的属性,... 实际上就是注释字符串, 这意味着你可以在在宏里面操作文档注释!","breadcrumbs":"声明宏 » 细节 » 片段分类符 » meta","id":"34","title":"meta"},"35":{"body":"pat 分类符用于匹配任何形式的模式 ( pattern ),包括 2021 edition 开始的 or-patterns 。 macro_rules! patterns { ($($pat:pat)*) => ();\n} patterns! { \"literal\" _ 0..5 ref mut PatternsAreNice 0 | 1 | 2 | 3 }\nfn main() {}","breadcrumbs":"声明宏 » 细节 » 片段分类符 » pat","id":"35","title":"pat"},"36":{"body":"从 2021 edition 起, or-patterns 模式开始应用,这让 pat 分类符不再允许跟随 |。 为了避免这个问题或者说恢复旧的 pat 分类符行为,你可以使用 pat_param 片段,它允许 | 跟在它后面,因为 pat_param 不允许 top level 或 or-patterns。 macro_rules! patterns { (pat: $pat:pat) => { println!(\"pat: {}\", stringify!($pat)); }; (pat_param: $($pat:pat_param)|+) => { $( println!(\"pat_param: {}\", stringify!($pat)); )+ };\n}\nfn main() { patterns! { pat: 0 | 1 | 2 | 3 } patterns! { pat_param: 0 | 1 | 2 | 3 }\n} macro_rules! patterns { ($( $( $pat:pat_param )|+ )*) => ();\n} patterns! { \"literal\" _ 0..5 ref mut PatternsAreNice 0 | 1 | 2 | 3 }\nfn main() {}","breadcrumbs":"声明宏 » 细节 » 片段分类符 » pat_param","id":"36","title":"pat_param"},"37":{"body":"path 分类符用于匹配类型中的路径 ( TypePath )。 这包括函数式的 trait 形式。 macro_rules! paths { ($($path:path)*) => ();\n} paths! { ASimplePath ::A::B::C::D G::::C FnMut(u32) -> ()\n}\nfn main() {}","breadcrumbs":"声明宏 » 细节 » 片段分类符 » path","id":"37","title":"path"},"38":{"body":"stmt 分类符只匹配的 语句 ( statement )。 除非 item 语句要求结尾有分号,否则 不会 匹配语句最后的分号。 什么叫 item 语句要求结尾有分号呢?单元结构体 (Unit-Struct) 就是一个简单的例子, 因为它定义中必须带上结尾的分号。 赶紧用例子展示上面说的是啥意思吧。下面的宏只给出它所捕获的内容,因为有几行不能通过编译。 macro_rules! statements { ($($stmt:stmt)*) => ($($stmt)*);\n} fn main() { statements! { struct Foo; fn foo() {} let zig = 3 let zig = 3; 3 3; if true {} else {} {} }\n} 你可以根据报错内容试着删除不能编译的代码,结合 stmt 小节开头的文字再琢磨琢磨。 你如果正浏览使用 mdbook 渲染的页面,那么可以直接运行和修改这段代码。 虽然源代码编译失败,但是我们可以展开宏 [3] , 使用 playground 的 Expand macros 工具 (tool);或者把代码复制到本地,在 nightly Rust 版本中使用 cargo rustc -- -Zunstable-options --pretty=expanded 命令得到宏展开结果: # warning: unnecessary trailing semicolon\n# --> src/main.rs:10:20\n# |\n# 10 | let zig = 3;\n# | ^ help: remove this semicolon\n# |\n# = note: `#[warn(redundant_semicolons)]` on by default\n# # warning: unnecessary trailing semicolon\n# --> src/main.rs:12:10\n# |\n# 12 | 3;\n# | ^ help: remove this semicolon\n# # #![feature(prelude_import)]\n# #[prelude_import]\n# use std::prelude::rust_2018::*;\n# #[macro_use]\n# extern crate std;\n# macro_rules! statements { ($ ($ stmt : stmt) *) => ($ ($ stmt) *) ; } fn main() { struct Foo; fn foo() { } let zig = 3; let zig = 3; ; 3; 3; ; if true { } else { } { }\n} 由此我们知道: 虽然 stmt 分类符没有捕获语句末尾的分号,但它依然在所需的时候返回了 (emit) 语句。原因很简单,分号本身就是有效的语句。所以我们实际输入 10 个语句调用了宏,而不是 8 个!这在把多个反复捕获放入一个反复展开时很重要,因为此时反复的次数必须相同。 在这里你应该注意到:struct Foo; 被匹配到了。否则我们会看到像其他情况一样有一个额外 ; 语句。由前所述,这能想通:item 语句需要分号,所以这个分号能被匹配到。 仅由块表达式或控制流表达式组成的表达式结尾没有分号, 其余的表达式捕获后产生的表达式会尾随一个分号(在这个例子中,正是这里出错)。 这里提到的细节能在 Reference 的 statement 一节中找到。但个细节通常这并不重要,除了要注意反复次数,通常没什么问题。 可阅读 调试 一章","breadcrumbs":"声明宏 » 细节 » 片段分类符 » stmt","id":"38","title":"stmt"},"39":{"body":"tt 分类符用于匹配标记树 (TokenTree)。 如果你是新手,对标记树不了解,那么需要回顾本书 标记树 一节。tt 分类符是最有作用的分类符之一,因为它能匹配几乎所有东西, 而且能够让你在使用宏之后检查 (inspect) 匹配的内容。 这让你可以编写非常强大的宏技巧,比如 tt-muncher 和 push-down-accumulator 。","breadcrumbs":"声明宏 » 细节 » 片段分类符 » tt","id":"39","title":"tt"},"4":{"body":"","breadcrumbs":"语法拓展 » 源代码分析 » 源代码解析方式","id":"4","title":"源代码解析方式"},"40":{"body":"ty 分类符用于匹配任何形式的类型表达式 ( type expression )。 类型表达式是在 Rust 中指代类型的语法。 macro_rules! types { ($($type:ty)*) => ();\n} types! { foo::bar bool [u8] impl IntoIterator\n}\nfn main() {}","breadcrumbs":"声明宏 » 细节 » 片段分类符 » ty","id":"40","title":"ty"},"41":{"body":"vis 分类符会匹配 可能为空 可见性修饰符 ( Visibility qualifier )。 macro_rules! visibilities { // ∨~~注意这个逗号,`vis` 分类符自身不会匹配到逗号 ($($vis:vis,)*) => ();\n} visibilities! { , // 没有 vis 也行,因为 $vis 隐式包含 `?` 的情况 pub, pub(crate), pub(in super), pub(in some_path),\n}\nfn main() {} vis 实际上只支持例子里的几种方式,因为这里的 visibility 指的是可见性,与私有性相对。而涉及这方面的内容只有与 pub 的关键字。所以,vis 在关心匹配输入的内容是公有还是私有时有用。 此外,如果匹配时,其后没有标记流,整个宏会匹配失败: macro_rules! non_optional_vis { ($vis:vis) => ();\n}\nnon_optional_vis!();\n// ^^^^^^^^^^^^^^^^ error: missing tokens in macro arguments\nfn main() {} 重点在于“可能为空”。你可能想到这是隐藏了 ? 重复操作符的分类符,这样你就不用直接在反复匹配时使用 ? —— 其实你不能将它和 ? 一起在重复模式匹配中使用。 可以匹配 $vis:vis $ident:ident,但不能匹配 $(pub)? $ident:ident,因为 pub 表明一个有效的标识符,所以后者是模糊不清的。 macro_rules! vis_ident { ($vis:vis $ident:ident) => ();\n}\nvis_ident!(pub foo); // this works fine macro_rules! pub_ident { ($(pub)? $ident:ident) => ();\n}\npub_ident!(pub foo); // ^^^ error: local ambiguity when calling macro `pub_ident`: multiple parsing options: built-in NTs ident ('ident') or 1 other option.\nfn main() {} 而且,搭配 tt 分类符和递归展开去匹配空标记也会导致有趣而奇怪的事情。 当 pub 匹配了空标记,元变量依然算一次被捕获,又因为它不是 tt、ident 或 lifetime,所以再次展开时是不清楚的。 这意味着如果这种捕获的结果传递给另一个将它视为 tt 的宏调用,你最终得到一棵空的标记树。 macro_rules! it_is_opaque { (()) => { \"()\" }; (($tt:tt)) => { concat!(\"$tt is \", stringify!($tt)) }; ($vis:vis ,) => { it_is_opaque!( ($vis) ); }\n}\nfn main() { // this prints \"$tt is \", as the recursive calls hits the second branch with // an empty tt, opposed to matching with the first branch! println!(\"{}\", it_is_opaque!(,));\n}","breadcrumbs":"声明宏 » 细节 » 片段分类符 » vis","id":"41","title":"vis"},"42":{"body":"","breadcrumbs":"声明宏 » 细节 » 再谈元变量与宏展开 » 再谈元变量与宏展开","id":"42","title":"再谈元变量与宏展开"},"43":{"body":"一旦语法分析器开始消耗标记以匹配某捕获,整个过程便 无法停止或回溯 。 这意味着,无论输入是什么样的,下面这个宏的第二项规则将永远无法被匹配到: macro_rules! dead_rule { ($e:expr) => { ... }; ($i:ident +) => { ... };\n} fn main() { dead_rule!(x+);\n} 考虑当以 dead_rule!(x+) 形式调用此宏时,将会发生什么。 解析器将从第一条规则开始试图进行匹配:它试图将输入解析为一个表达式。 第一个标记 x 作为表达式是有效的,第二个标记——作为二元加符号 + 的节点——在表达式中也是有效的。 由此你可能会以为,由于输入中并不包含二元加号 + 的右侧元素, 分析器将会放弃尝试这一规则,转而尝试下一条规则。 实则不然:分析器将会 panic 并终止整个编译过程,最终返回一个语法错误。 由于分析器的这一特点,下面这点尤为重要: 一般而言,在书写宏规则时, 应从最具体的开始写起,依次写直到最不具体的 。","breadcrumbs":"声明宏 » 细节 » 再谈元变量与宏展开 » 书写宏规则的顺序","id":"43","title":"书写宏规则的顺序"},"44":{"body":"为防止将来的语法变动影响宏输入的解析方式, macro_rules! 对紧接元变量后的内容施加了限制。 在 Rust 1.52 中,能够紧跟片段分类符后面的内容具有如下限制 [1] : stmt 和 expr :=>、,、; 之一 pat :=>、,、=、if、in 之一 [2] [pat_param]:=>、,、=、|、if、in 之一 path 和 ty :=>、,、=、|、;、:、>、>>、[、{、as、where 之一; 或者 block 型的元变量 vis :,、除了 priv 之外的标识符、任何以类型开头的标记、 ident 或 ty 或 path 型的元变量 其他片段分类符所跟的内容无限制 使用 2021 edition 之前的 Rust,pat 依然可以跟随 |。 反复匹配的情况也遵循这些限制 [1] ,也就是说: 如果一个重复操作符(* 或 +)能让一类元变量重复数次, 那么反复出现的内容就是这类元变量,反复结束之后所接的内容遵照上面的限制。 如果一个重复操作符(* 或 ?)让一类元变量重复零次, 那么元变量之后的内容遵照上面的限制。 内容来自于 Reference follow-set-ambiguity-restrictions 一节。","breadcrumbs":"声明宏 » 细节 » 再谈元变量与宏展开 » 片段分类符的跟随限制","id":"44","title":"片段分类符的跟随限制"},"45":{"body":"解析器不会预先运行代码,这意味着如果编译器不能一次就唯一地确定如何解析宏调用, 那么编译器就带着模糊的报错信息而终止运行。 一个触发终止运行的例子是: macro_rules! ambiguity { ($($i:ident)* $i2:ident) => { };\n} // error:\n// local ambiguity: multiple parsing options: built-in NTs ident ('i') or ident ('i2').\nfn main() { ambiguity!(an_identifier); } 编译器不会提前看到传入的标识符之后是不是一个 ),如果提前看到的话就会解析正确。","breadcrumbs":"声明宏 » 细节 » 再谈元变量与宏展开 » 编译器拒绝模糊的规则","id":"45","title":"编译器拒绝模糊的规则"},"46":{"body":"关于代换元变量 (substitution,这里指把已经进行宏解析的 token 再次传给宏) , 常常让人惊讶的一面是,尽管 很像 是根据标记 (token) 进行代换的,但事实并非如此 ——代换基于已经解析的 AST 节点。 思考下面的例子: macro_rules! capture_then_match_tokens { ($e:expr) => {match_tokens!($e)};\n} macro_rules! match_tokens { ($a:tt + $b:tt) => {\"got an addition\"}; (($i:ident)) => {\"got an identifier\"}; ($($other:tt)*) => {\"got something else\"};\n} fn main() { println!(\"{}\\n{}\\n{}\\n\", match_tokens!((caravan)), match_tokens!(3 + 6), match_tokens!(5)); println!(\"{}\\n{}\\n{}\", capture_then_match_tokens!((caravan)), capture_then_match_tokens!(3 + 6), capture_then_match_tokens!(5));\n} 其结果: got an identifier\ngot an addition\ngot something else got something else\ngot something else\ngot something else 通过解析已经传入 AST 节点的输入,代换的结果变得 很稳定 :你再也无法检查其内容了, 也不再匹配内容。 另一个例子可能也会很令人困惑: macro_rules! capture_then_what_is { (#[$m:meta]) => {what_is!(#[$m])};\n} macro_rules! what_is { (#[no_mangle]) => {\"no_mangle attribute\"}; (#[inline]) => {\"inline attribute\"}; ($($tts:tt)*) => {concat!(\"something else (\", stringify!($($tts)*), \")\")};\n} fn main() { println!( \"{}\\n{}\\n{}\\n{}\", what_is!(#[no_mangle]), what_is!(#[inline]), capture_then_what_is!(#[no_mangle]), capture_then_what_is!(#[inline]), );\n} 结果是: no_mangle attribute\ninline attribute\nsomething else (#[no_mangle])\nsomething else (#[inline]) 避免这个意外情况的唯一方式就是使用 tt 、 ident 或者 lifetime 分类符。 每当你捕获到除此之外的分类符,结果将只能被用于直接输出。 比如这里使用的 stringify! [3] ,它是一条内置于编译器的语法拓展 ( 查看源码可知 ), 将所有输入标记结合在一起,作为单个字符串输出。 这里未包含原作对 stringify! 用于替换 (substitution) 场景的 解读 ,因为那个例子的结果有些变化。","breadcrumbs":"声明宏 » 细节 » 再谈元变量与宏展开 » 不基于标记的代换","id":"46","title":"不基于标记的代换"},"47":{"body":"RFC : rfcs#1584 Tracking Issue : rust#83527 Feature : #![feature(macro_metavar_expr)] 注意:示例代码片段非常简单,只试图展示它们是如何工作的。 关于这些元变量表达式,如果你认为你有合适的、单独使用的小片段,请提交它们! 正如在 思路 中提到的,Rust 有一些特殊的元变量表达式(以下简称表达式):transcriber [1] 可以使用这些表达式来获取有关元变量的信息。如果没有这些表达式,它们所提供的信息就很难甚至不可能获得。 本章将结合用例对它们进行更深入的介绍。 $$ ${count(ident, depth)} ${index(depth)} ${length(depth)} ${ignore(ident)} 译者注:在专业的讨论中,尤其涉及元变量表达式,常用 transcribe(r) 一词而不使用 expand (expansion)。","breadcrumbs":"声明宏 » 细节 » 元变量表达式 » 元变量表达式","id":"47","title":"元变量表达式"},"48":{"body":"$$ 表达式展开为单个 $,实际上使其成为转义的 $。这让声明宏宏生成新的声明宏。 因为以前的声明宏将无法转义 $,所以无法使用元变量、重复和元变量表达式。例如以下代码片段中不使用 $$,就无法使用 bar!: macro_rules! foo { () => { macro_rules! bar { ( $( $any:tt )* ) => { $( $any )* }; // ^^^^^^^^^^^ error: attempted to repeat an expression containing no syntax variables matched as repeating at this depth } };\n} foo!();\n# fn main() {} 问题很明显, foo! 的 transcriber 看到有反复捕获的意图,并试图反复捕获,但它的作用域中没有 $any 元变量,这导致它产生错误。有了 $$,我们就可以解决这个问题 [2] ,因为 foo 的 transcriber 不再尝试反复捕获。 #![feature(macro_metavar_expr)] macro_rules! foo { () => { macro_rules! bar { ( $$( $$any:tt )* ) => { $$( $$any )* }; } };\n} foo!();\nbar!();\n# fn main() {} 译者注:在没有 $$ 之前,存在一种技巧绕过这里的问题:你可以使用 $tt 捕获 $ 来进行转义,比如 这样 。","breadcrumbs":"声明宏 » 细节 » 元变量表达式 » Dollar Dollar ($$)","id":"48","title":"Dollar Dollar ($$)"},"49":{"body":"count 表达式展开成元变量 $ident 在给定反复深度的反复次数。 ident 参数必须是规则作用域中声明的元变量 depth 参数必须是值小于或等于元变量 $ident 出现的最大反复深度的整型字面值 count(ident, depth) 展开成不带后缀的整型字面值标记 count(ident) 是 count(ident, 0) 的简写 #![feature(macro_metavar_expr)] macro_rules! foo { ( $( $outer:ident ( $( $inner:ident ),* ) ; )* ) => { println!(\"count(outer, 0): $outer repeats {} times\", ${count($outer)}); println!(\"count(inner, 0): The $inner repetition repeats {} times in the outer repetition\", ${count($inner, 0)}); println!(\"count(inner, 1): $inner repeats {} times in the inner repetitions\", ${count($inner, 1)}); };\n} fn main() { foo! { outer () ; outer ( inner , inner ) ; outer () ; outer ( inner ) ; };\n}","breadcrumbs":"声明宏 » 细节 » 元变量表达式 » count(ident, depth)","id":"49","title":"count(ident, depth)"},"5":{"body":"Rust程序编译过程的第一阶段是 标记解析 。 在这一过程中,源代码将被转换成一系列的标记 (token)。 token:无法被分割的词法单元;在编程语言世界中等价于“单词”。 Rust包含多种标记,比如: 标识符 (identifiers): foo, Bambous, self, we_can_dance, LaCaravane, … 字面值 (literals): 42, 72u32, 0_______0, 1.0e-40, \"ferris was here\", … 关键字 (keywords): _, fn, self, match, yield, macro, … 符号 (symbols): [, :, ::, ?, ~, @ [1] , … 等等 。 有些地方值得注意: self 既是一个标识符又是一个关键词。 几乎在所有情况下它都被视作是一个关键词,但它有可能被视为标识符。 我们稍后会(骂骂咧咧地)提到这种情况。 关键词里列有一些可疑的家伙,比如 yield 和 macro。 它们在当前的Rust语言中并没有任何含义,但编译器的确会把它们视作关键词进行解析。 这些词语被保留作语言未来扩充时使用。 符号里也列有一些未被当前语言使用的条目。比如 <-,这是历史残留: 目前它被移除了Rust语法,但词法分析器仍然没丢掉它。 注意 :: 被视作一个独立的标记,而非两个连续的 : 。 这一规则适用于截至 Rust 1.2 版本的所有的多字符符号标记。 [2] @ 被用在模式中,用来绑定模式非终止的部分到一个名称——但这似乎被大多数人完全地遗忘了。 严格来说, Rust 1.52 版本中存在两个词法分析器 (lexer): rustc_lexer 只将单个字符作为 标记 (tokens); rustc_parse 里的 lexer 把多个字符作为不同的 标记 (tokens)。 作为对比,某些语言的宏系统正扎根于这一阶段。Rust并非如此。 举例来说,从效果来看,C/C++的宏就是在这里得到处理的。 [3] 这也正是下列代码能够运行的原因: [4] #define SUB void\n#define BEGIN {\n#define END } SUB main() BEGIN printf(\"Oh, the horror!\\n\");\nEND 实际上,C 预处理程序使用与 C 自身所不同的词法结构,但这些区别很大程度上无关紧要。 是否应该这样运行完全是一个另外的话题了。","breadcrumbs":"语法拓展 » 源代码分析 » 标识化 (Tokenization)","id":"5","title":"标识化 (Tokenization)"},"50":{"body":"index(depth) 表达式展开为给定反复深度下,当前的迭代索引。 depth 参数表明在第几层反复,这个数字从最内层反复调用表达式开始向外计算 index(depth) 展开成不带后缀的整型字面值标记 index() 是 index(0) 的简写 #![feature(macro_metavar_expr)] macro_rules! attach_iteration_counts { ( $( ( $( $inner:ident ),* ) ; )* ) => { ( $( $(( stringify!($inner), ${index(1)}, // 这指的是外层反复 ${index()} // 这指的是内层反复,等价于 `index(0)` ),)* )* ) };\n} fn main() { let v = attach_iteration_counts! { ( hello ) ; ( indices , of ) ; () ; ( these, repetitions ) ; }; println!(\"{v:?}\");\n}","breadcrumbs":"声明宏 » 细节 » 元变量表达式 » index(depth)","id":"50","title":"index(depth)"},"51":{"body":"length(depth) 表达式展开为在给定反复深度的迭代次数。 depth 参数表示在第几层反复,这个数字从最内层反复调用表达式开始向外计算 length(depth) 展开成不带后缀的整型字面值标记 length() 是 length(0) 的简写 #![feature(macro_metavar_expr)] macro_rules! lets_count { ( $( $outer:ident ( $( $inner:ident ),* ) ; )* ) => { $( $( println!( \"'{}' in inner iteration {}/{} with '{}' in outer iteration {}/{} \", stringify!($inner), ${index()}, ${len()}, stringify!($outer), ${index(1)}, ${len(1)}, ); )* )* };\n} fn main() { lets_count!( many (small , things) ; none () ; exactly ( one ) ; );\n}","breadcrumbs":"声明宏 » 细节 » 元变量表达式 » length(depth)","id":"51","title":"length(depth)"},"52":{"body":"ignore(ident) 表达式展开为空,这使得在无需实际展开元变量的时候,像元变量反复展开相同次数的某些内容。 ident 参数必须是规则作用域中声明的元变量 #![feature(macro_metavar_expr)] macro_rules! repetition_tuples { ( $( ( $( $inner:ident ),* ) ; )* ) => { ($( $( ( ${index()}, ${index(1)} ${ignore($inner)} // without this metavariable expression, compilation would fail ), )* )*) };\n} fn main() { let tuple = repetition_tuples!( ( one, two ) ; () ; ( one ) ; ( one, two, three ) ; ); println!(\"{tuple:?}\");\n}","breadcrumbs":"声明宏 » 细节 » 元变量表达式 » ignore(ident)","id":"52","title":"ignore(ident)"},"53":{"body":"译者注:卫生性 (hygiene) 描述的是 标识符 在宏处理和展开过程中是“宏定义处的标识符不与外部定义的标识符交互”、“不被外部同名标识符污染的”。见 卫生性和 Span 。","breadcrumbs":"声明宏 » 细节 » 宏是部分“卫生的” » 卫生性","id":"53","title":"卫生性"},"54":{"body":"Rust 里的声明宏是 部分 卫生的 (partially hygienic 或者称作 mixed hygiene)。 具体来说,对于以下内容,声明宏是卫生的: 局部变量 (local variables) labels $crate 除此之外,声明宏都不是卫生的。 [1] 推荐尝试 Rust Quiz #24 ,并阅读 “Truly Hygienic” Let Statements in Rust 。 之所以能做到“卫生”,是因为每个标识符都被赋予了一个看不见的“句法上下文” (syntax context)。在比较两个标识符时,只有在标识符的原文名称和句法上下文都 完全一样 的情况下,两个标识符才能被视作等同。 为阐释这一点,考虑下述代码: macro_rules! using_a { ($e:expr) => { { let a = 42; $e } }\n} let four = using_a!(a / 10); 我们将采用背景色来表示句法上下文。现在,将上述宏调用展开如下: let four = { let a = 42; a / 10\n}; 首先,回想一下,在展开的期间调用声明宏,实际是空(因为那是一棵待补全的语法树)。 其次,如果我们现在就尝试编译上述代码,编译器将报如下错误: error[E0425]: cannot find value `a` in this scope --> src/main.rs:13:21 |\n13 | let four = using_a!(a / 10); | ^ not found in this scope 注意到宏在展开后背景色(即其句法上下文)发生了改变。 每处宏展开均赋予其内容一个新的、独一无二的上下文。 故而,在展开后的代码中实际上存在 两个 不同的 a,它们分别有不同的句法上下文。 即,第一个 a 与第二个 a 并不相同,即使它们便看起来很像。 也就是说,被替换进宏展开中的标记仍然 保持 着它们原有的句法上下文。 因为它们是被传给这宏的,并非这宏本身的一部分。因此,我们作出如下修改: macro_rules! using_a { ($a:ident, $e:expr) => { { let $a = 42; $e } }\n} let four = using_a!(a, a / 10); 展开如下: let four = { let a = 42; a / 10\n}; 因为只用了一个 a(显然 a 在此处是局部变量),编译器将欣然接受此段代码。","breadcrumbs":"声明宏 » 细节 » 宏是部分“卫生的” » 宏是部分卫生的","id":"54","title":"宏是部分卫生的"},"55":{"body":"当声明宏需要其定义所在的 (defining) crate 的其他 items 时,由于“卫生性”,我们需要使用 $crate 元变量。 这个特殊的元变量所做的事情是,它展开成宏所定义的 crate 的绝对路径。 //// 在 `helper_macro` crate 里定义 `helped!` 和 `helper!` 宏\n#[macro_export]\nmacro_rules! helped { // () => { helper!() } // 这行可能导致 `helper` 不在作用域的错误 () => { $crate::helper!() }\n} #[macro_export]\nmacro_rules! helper { () => { () }\n} //// 在另外的 crate 中使用这两个宏\n// 注意:`helper_macro::helper` 并没有导入进来\nuse helper_macro::helped; fn unit() { // 这个宏能运行通过,因为 `$crate` 正确地展开成 `helper_macro` crate 的路径(而不是使用者的路径) helped!();\n} 请注意,$crate 用在指明非宏的 items 时,它必须和完整且有效的模块路径一起使用。如下: pub mod inner { #[macro_export] macro_rules! call_foo { () => { $crate::inner::foo() }; } pub fn foo() {}\n}","breadcrumbs":"声明宏 » 细节 » 宏是部分“卫生的” » $crate 元变量","id":"55","title":"$crate 元变量"},"56":{"body":"译者注:这里需要记住的重点是 self 可以使用 ident 或者 tt 分类符来匹配; _ 只能在模式中使用,不能用 ident 分类符匹配,而是用 pat 或者 tt 分类符匹配。 有两个标记,当你最终撞见时,很有可能认为它们是标识符 ( ident ),但实际上它们不是。 然而正是这些标记,在某些情况下又的确是标识符。","breadcrumbs":"声明宏 » 细节 » 非标识符的“标识符” » 非标识符的“标识符”","id":"56","title":"非标识符的“标识符”"},"57":{"body":"第一个是 self。毫无疑问,它是一个 关键词 ( keyword )。在一般的 Rust 代码中,不可能出现把它解读成标识符的情况;但在宏中这种情况则有可能发生: macro_rules! what_is { (self) => {\"the keyword `self`\"}; ($i:ident) => {concat!(\"the identifier `\", stringify!($i), \"`\")};\n} macro_rules! call_with_ident { ($c:ident($i:ident)) => {$c!($i)};\n} fn main() { println!(\"{}\", what_is!(self)); println!(\"{}\", call_with_ident!(what_is(self)));\n} 上述代码的输出将是: the keyword `self`\nthe keyword `self` 但这说不通啊!call_with_ident! 要求一个标识符,而且它的确匹配到了,还成功替换了!所以, self 同时是一个关键词,但又不是。你可能会想,好吧,但这鬼东西哪里重要呢?看看这个: macro_rules! make_mutable { ($i:ident) => {let mut $i = $i;};\n} struct Dummy(i32); impl Dummy { fn double(self) -> Dummy { make_mutable!(self); self.0 *= 2; self }\n} fn main() { println!(\"{:?}\", Dummy(4).double().0);\n} 编译它会失败,并报错: error: `mut` must be followed by a named binding --> src/main.rs:2:24 |\n2 | ($i:ident) => {let mut $i = $i;}; | ^^^^^^ help: remove the `mut` prefix: `self`\n...\n9 | make_mutable!(self); | -------------------- in this macro invocation | = note: `mut` may be followed by `variable` and `variable @ pattern` 所以说,宏在匹配的时候,会欣然把 self 当作标识符接受,进而允许你把 self 带到那些实际上没办法使用的情况中去。但是,也成吧,既然得同时记住 self 既是关键词又是标识符,那下面这个讲道理应该可行,对吧? macro_rules! make_self_mutable { ($i:ident) => {let mut $i = self;};\n} struct Dummy(i32); impl Dummy { fn double(self) -> Dummy { make_self_mutable!(mut_self); mut_self.0 *= 2; mut_self }\n} fn main() { println!(\"{:?}\", Dummy(4).double().0);\n} 实际上也不行,编译错误变成: error[E0424]: expected value, found module `self` --> src/main.rs:2:33 |\n2 | ($i:ident) => {let mut $i = self;}; | ^^^^ `self` value is a keyword only available in methods with a `self` parameter\n...\n8 | / fn double(self) -> Dummy {\n9 | | make_self_mutable!(mut_self); | | ----------------------------- in this macro invocation\n10 | | mut_self.0 *= 2;\n11 | | mut_self\n12 | | } | |_____- this function has a `self` parameter, but a macro invocation can only access identifiers it receives from parameters | 这同样也说不通。这简直就像是在抱怨说,它看见的两个 self 不是同一个 self ... 就搞得像关键词 self 就像标识符一样,也有卫生性。 macro_rules! double_method { ($body:expr) => { fn double(mut self) -> Dummy { $body } };\n} struct Dummy(i32); impl Dummy { double_method! {{ self.0 *= 2; self }}\n} fn main() { println!(\"{:?}\", Dummy(4).double().0);\n} 还是报同样的错。那这个如何: macro_rules! double_method { ($self_:ident, $body:expr) => { fn double(mut $self_) -> Dummy { $body } };\n} struct Dummy(i32); impl Dummy { double_method! {self, { self.0 *= 2; self }}\n} fn main() { println!(\"{:?}\", Dummy(4).double().0);\n} 终于管用了。所以说,self 是关键词,但如果想它变成标识符,那么同时也能是一个标识符。 那么,相同的道理对类似的其它东西有用吗?","breadcrumbs":"声明宏 » 细节 » 非标识符的“标识符” » self","id":"57","title":"self"},"58":{"body":"macro_rules! double_method { ($self_:ident, $body:expr) => { fn double($self_) -> Dummy { $body } };\n} struct Dummy(i32); impl Dummy { double_method! {_, 0}\n} fn main() { println!(\"{:?}\", Dummy(4).double().0);\n} error: no rules expected the token `_` --> src/main.rs:12:21 |\n1 | macro_rules! double_method { | -------------------------- when calling this macro\n...\n12 | double_method! {_, 0} | ^ no rules expected this token in macro call 哈,当然不行。即便它 如同 self 一样从定义上讲是标识符,但 _ 在模式以及表达式中是一个合法的 (valid) 关键词,而不是一个标识符。 你可能觉得,既然 _ 在模式中有效,那换成 $self_:pat 是不是就能一石二鸟了呢? 可惜了,也不行,因为 self 不是一个有效的模式。 如果你真想同时匹配这两个标记,仅有的办法是换用 tt 来匹配。","breadcrumbs":"声明宏 » 细节 » 非标识符的“标识符” » _","id":"58","title":"_"},"59":{"body":"注意:这是一个专门为声明宏量身定做的调试工具清单,调试宏的其他方法可以在语法扩展的 调试 章节中找到。","breadcrumbs":"声明宏 » 细节 » 调试 » 调试","id":"59","title":"调试"},"6":{"body":"编译过程的下一个阶段是语法解析 (parsing)。 这一过程中,一系列的 token 将被转换成一棵抽象语法树 (AST: Abstract Syntax Tree )。 此过程将在内存中建立起程序的语法结构。 举例来说,标记序列 1+2 将被转换成某种类似于: ┌─────────┐ ┌─────────┐\n│ BinOp │ ┌╴│ LitInt │\n│ op: Add │ │ │ val: 1 │\n│ lhs: ◌ │╶┘ └─────────┘\n│ rhs: ◌ │╶┐ ┌─────────┐\n└─────────┘ └╴│ LitInt │ │ val: 2 │ └─────────┘ AST 将包含 整个 程序的结构,但这一结构仅包含词法信息。 举例来讲,在这个阶段编译器虽然可能知道某个表达式提及了某个名为 a 的变量, 但它并 没有办法知道 a 究竟是什么,或者它从哪来。 在 AST 生成之后,宏处理过程才开始。 但在讨论宏处理过程之前,我们需要先谈谈标记树 (token tree)。","breadcrumbs":"语法拓展 » 源代码分析 » 语法解析 (Parsing)","id":"6","title":"语法解析 (Parsing)"},"60":{"body":"最有用的是 trace_macros! ,在每次声明宏展开前,它指示编译器记录下声明宏的调用信息。 例如: # // 注意:这需要 nightly Rust\n#![feature(trace_macros)] macro_rules! each_tt { () => {}; ($_tt:tt $($rest:tt)*) => {each_tt!($($rest)*);};\n} each_tt!(foo bar baz quux);\ntrace_macros!(true);\neach_tt!(spim wak plee whum);\ntrace_macros!(false);\neach_tt!(trom qlip winp xod);\n#\n# fn main() {} 输出为: note: trace_macro --> src/main.rs:11:1 |\n11 | each_tt!(spim wak plee whum); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: expanding `each_tt! { spim wak plee whum }` = note: to `each_tt ! (wak plee whum) ;` = note: expanding `each_tt! { wak plee whum }` = note: to `each_tt ! (plee whum) ;` = note: expanding `each_tt! { plee whum }` = note: to `each_tt ! (whum) ;` = note: expanding `each_tt! { whum }` = note: to `each_tt ! () ;` = note: expanding `each_tt! { }` = note: to `` 它在调试递归很深的宏时尤其有用。 此外,你可以在命令行里,给编译指令附加 -Z trace-macros 来打印追踪的宏。 trace_macros!(false); 之后的宏不会被这个附加指令追踪到,所以这里会追踪前两个宏。 参考命令:cargo rustc --bin binary_name -- -Z trace-macros","breadcrumbs":"声明宏 » 细节 » 调试 » trace_macros!","id":"60","title":"trace_macros!"},"61":{"body":"另一有用的宏是 log_syntax! 。它将使得编译器输出所有经过编译器处理的标记。 比如让编译器“唱首歌”: # // 注意:这需要 nightly Rust\n#![feature(log_syntax)] macro_rules! sing { () => {}; ($tt:tt $($rest:tt)*) => {log_syntax!($tt); sing!($($rest)*);};\n} sing! { ^ < @ < . @ * '\\x08' '{' '\"' _ # ' ' - @ '$' && / _ % ! ( '\\t' @ | = > ; '\\x08' '\\'' + '$' ? '\\x7f' , # '\"' ~ | ) '\\x07'\n}\n#\n# fn main() {} 比起 trace_macros! 来说,它能够做一些更有针对性的调试。","breadcrumbs":"声明宏 » 细节 » 调试 » log_syntax!","id":"61","title":"log_syntax!"},"62":{"body":"另一个很棒的工具是 lukaslueg 编写的 macro_railroad lib。 它能可视化地生成 Rust macro_rules! 宏的语法图 (syntax diagrams)。 它还有一个 浏览器插件 ,和一个可动态可视化声明宏的 静态网页 。","breadcrumbs":"声明宏 » 细节 » 调试 » macro_railroad lib","id":"62","title":"macro_railroad lib"},"63":{"body":"这部分最新的内容可参考 Reference 的 scoping-exporting-and-importing 一节。部分翻译内容引自 Reference 中文版 。 函数式宏的作用域规则可能有一点反直觉。(函数式宏包括声明宏与函数式过程宏。) 由于历史原因,宏的作用域并不完全像各种程序项那样工作。 有两种形式的作用域:文本作用域 (textual scope) 和 基于路径的作用域 (path-based scope)。 文本作用域:基于宏在源文件中(定义和使用所)出现的顺序,或是跨多个源文件出现的顺序, 文本作用域是默认的作用域。 基于路径的作用域:与其他程序项作用域的运行方式相同。 当声明宏被 非限定标识符(unqualified identifier,非多段路径段组成的限定性路径)调用时, 会首先在文本作用域中查找。 如果文本作用域中没有任何结果,则继续在基于路径的作用域中查找。 如果宏的名称由路径限定 (qualified with a path) ,则只在基于路径的作用域中查找。","breadcrumbs":"声明宏 » 细节 » 作用域 » 作用域","id":"63","title":"作用域"},"64":{"body":"","breadcrumbs":"声明宏 » 细节 » 作用域 » 文本作用域","id":"64","title":"文本作用域"},"65":{"body":"与 Rust 语言其余所有部分都不同的是,函数式宏在子模块中仍然可见。 macro_rules! X { () => {}; }\nmod a { X!(); // defined\n}\nmod b { X!(); // defined\n}\nmod c { X!(); // defined\n}\n# fn main() {} 注意:即使子模组的内容处在不同文件中,这些例子中所述的行为仍然保持不变。","breadcrumbs":"声明宏 » 细节 » 作用域 » 宏在子模块中可见","id":"65","title":"宏在子模块中可见"},"66":{"body":"同样与 Rust 语言其余所有部分不同,宏只有在其定义 之后 可见。 下例展示了这一点。同时注意到,它也展示了宏不会“漏出” (leak) 其定义所在的作用域: mod a { // X!(); // undefined\n}\nmod b { // X!(); // undefined macro_rules! X { () => {}; } X!(); // defined\n}\nmod c { // X!(); // undefined\n}\n# fn main() {} 要清楚,即使你把宏移动到外层作用域,词法依赖顺序的规则依然适用。 mod a { // X!(); // undefined\n} macro_rules! X { () => {}; } mod b { X!(); // defined\n}\nmod c { X!(); // defined\n}\n# fn main() {}","breadcrumbs":"声明宏 » 细节 » 作用域 » 宏在定义之后可见","id":"66","title":"宏在定义之后可见"},"67":{"body":"然而对于宏自身来说,这种具有顺序的依赖行为不存在。 即被调用的宏可以先于调用宏之前声明: mod a { // X!(); // undefined\n} macro_rules! X { () => { Y!(); }; } // 注意这里的代码运行通过 mod b { // 注意这里 X 虽然被定义,但是 Y 不被定义,所以不能使用 X // X!(); // defined, but Y! is undefined } macro_rules! Y { () => {}; } mod c { X!(); // defined, and so is Y!\n}\n# fn main() {}","breadcrumbs":"声明宏 » 细节 » 作用域 » 宏与宏之间顺序无关","id":"67","title":"宏与宏之间顺序无关"},"68":{"body":"允许多次定义 macro_rules! 宏,最后声明的宏会简单地覆盖 (shadow) 上一个声明的同名宏; 如果最后声明的宏离开作用域,上一个宏在有效的作用域内还能被使用。 macro_rules! X { (1) => {}; }\nX!(1);\nmacro_rules! X { (2) => {}; }\n// X!(1); // Error: no rule matches `1`\nX!(2); mod a { macro_rules! X { (3) => {}; } // X!(2); // Error: no rule matches `2` X!(3);\n}\n// X!(3); // Error: no rule matches `3`\nX!(2); fn main() { }","breadcrumbs":"声明宏 » 细节 » 作用域 » 宏可以被暂时覆盖","id":"68","title":"宏可以被暂时覆盖"},"69":{"body":"这个属性放置在宏定义所在的模块前 或者 extern crate 语句前。 在模块前加上 #[macro_use] 属性:导出该模块内的所有宏, 从而让导出的宏在所定义的模块结束之后依然可用。 mod a { // X!(); // undefined\n} #[macro_use]\nmod b { macro_rules! X { () => {}; } X!(); // defined\n} mod c { X!(); // defined\n}\n# fn main() {} 注意,这可能会产生一些奇怪的后果,因为宏(包括过程宏)中的标识符只有在宏展开的过程中才会被解析。 mod a { // X!(); // undefined\n} #[macro_use]\nmod b { macro_rules! X { () => { Y!(); }; } // X!(); // defined, but Y! is undefined\n} macro_rules! Y { () => {}; } mod c { X!(); // defined, and so is Y!\n}\n# fn main() {} 给 extern crate 语句加上 #[macro_use] 属性: 把外部 crate 定义且导出的宏引入当前 crate 的根/顶层模块。(当前 crate 使用外部 crate) 假设在外部名称为 mac 的 crate 中定义了 X! 宏,在当前模块: //// 这里的 `X!` 与 `Y!` 无关,前者定义于外部 crate,后者定义于当前 crate mod a { // X!(); // defined, but Y! is undefined\n} macro_rules! Y { () => {}; } mod b { X!(); // defined, and so is Y!\n} #[macro_use] extern crate macs;\nmod c { X!(); // defined, and so is Y!\n} # fn main() {}","breadcrumbs":"声明宏 » 细节 » 作用域 » #[macro_use] 属性","id":"69","title":"#[macro_use] 属性"},"7":{"body":"标记树是介于 标记 (token) 与 AST 之间的东西。 首先明确一点,几乎所有标记都构成标记树。 具体来说,它们可被看作标记树叶节点。 还有另一类事物也可被看作标记树叶节点,我们将在稍后提到它。 仅有的一种基础标记不是标记树叶节点——“分组”标记:(...), [...] 和 {...}。 这三者属于标记树内的节点,正是它们给标记树带来了树状的结构。 给个具体的例子,这列标记: a + b + (c + d[0]) + e 将被解析为这样的标记树: «a» «+» «b» «+» «( )» «+» «e» ╭────────┴──────────╮ «c» «+» «d» «[ ]» ╭─┴─╮ «0» 注意它跟最后生成的 AST 并 没有关联 。 AST 将仅有一个根节点,而这棵标记树有 七 个。 作为参考,最后生成的 AST 应该是这样: ┌─────────┐ │ BinOp │ │ op: Add │ ┌╴│ lhs: ◌ │\n┌─────────┐ │ │ rhs: ◌ │╶┐ ┌─────────┐\n│ Var │╶┘ └─────────┘ └╴│ BinOp │\n│ name: a │ │ op: Add │\n└─────────┘ ┌╴│ lhs: ◌ │ ┌─────────┐ │ │ rhs: ◌ │╶┐ ┌─────────┐ │ Var │╶┘ └─────────┘ └╴│ BinOp │ │ name: b │ │ op: Add │ └─────────┘ ┌╴│ lhs: ◌ │ ┌─────────┐ │ │ rhs: ◌ │╶┐ ┌─────────┐ │ BinOp │╶┘ └─────────┘ └╴│ Var │ │ op: Add │ │ name: e │ ┌╴│ lhs: ◌ │ └─────────┘ ┌─────────┐ │ │ rhs: ◌ │╶┐ ┌─────────┐ │ Var │╶┘ └─────────┘ └╴│ Index │ │ name: c │ ┌╴│ arr: ◌ │ └─────────┘ ┌─────────┐ │ │ ind: ◌ │╶┐ ┌─────────┐ │ Var │╶┘ └─────────┘ └╴│ LitInt │ │ name: d │ │ val: 0 │ └─────────┘ └─────────┘ 理解 AST 与 标记树 (token tree) 之间的区别至关重要。 写宏时,你将同时与这两者打交道。 还有一条需要注意: 不可能 出现不匹配的小/中/大括号,也不可能存在包含错误嵌套结构的标记树。","breadcrumbs":"语法拓展 » 源代码分析 » 标记树 (Token Trees)","id":"7","title":"标记树 (Token Trees)"},"70":{"body":"前四条作用域规则同样适用于函数。 至于第五条规则, #[macro_use] 属性并不直接作用于函数。 macro_rules! X { () => { Y!() };\n} fn a() { macro_rules! Y { () => {\"Hi!\"} } assert_eq!(X!(), \"Hi!\"); { assert_eq!(X!(), \"Hi!\"); macro_rules! Y { () => {\"Bye!\"} } assert_eq!(X!(), \"Bye!\"); } assert_eq!(X!(), \"Hi!\");\n} fn b() { macro_rules! Y { () => {\"One more\"} } assert_eq!(X!(), \"One more\");\n}\n# # fn main() {\n# a();\n# b();\n# }","breadcrumbs":"声明宏 » 细节 » 作用域 » 当宏放在函数内","id":"70","title":"当宏放在函数内"},"71":{"body":"由于前述种种规则,一般来说, 建议将所有应对整个 crate 均可见的宏的定义置于根模块的最顶部, 借以确保它们 一直 可用。 这个建议和适用于在文件 mod 定义的宏: #[macro_use]\nmod some_mod_that_defines_macros;\nmod some_mod_that_uses_those_macros; 这里的顺序很重要,因为第二个模块依赖于第一个模块的宏, 所以改变这两个模块的顺序会无法编译。","breadcrumbs":"声明宏 » 细节 » 作用域 » 关于宏声明的位置","id":"71","title":"关于宏声明的位置"},"72":{"body":"Rust 的 macro_rules! 宏 默认并没有基于路径的作用域。 然而,如果这个宏被加上 #[macro_export] 属性,那么它就在 crate 的根作用域里被定义, 而且能直接使用它。 导入/导出宏 一章会更深入地探讨这个属性。","breadcrumbs":"声明宏 » 细节 » 作用域 » 基于路径的作用域","id":"72","title":"基于路径的作用域"},"73":{"body":"在 Rust 的 2015 和 2018 版本中,导入 macro_rules! 宏是不一样的。 仍然建议阅读这两部分,因为 2018 版使用的结构在 2015 版中做出了解释。","breadcrumbs":"声明宏 » 细节 » 导入/导出宏 » 导入/导出","id":"73","title":"导入/导出"},"74":{"body":"","breadcrumbs":"声明宏 » 细节 » 导入/导出宏 » 2015 版本","id":"74","title":"2015 版本"},"75":{"body":"作用域 一章中介绍的 #[macro_use] 属性 适用于模块或者 external crates 。例如: #[macro_use]\nmod macros { macro_rules! X { () => { Y!(); } } macro_rules! Y { () => {} }\n} X!();\n#\n# fn main() {}","breadcrumbs":"声明宏 » 细节 » 导入/导出宏 » #[macro_use]","id":"75","title":"#[macro_use]"},"76":{"body":"可通过 #[macro_export] 将宏从当前crate导出。注意,这种方式 无视 所有可见性设定。 定义 lib 包 macs 如下: mod macros { #[macro_export] macro_rules! X { () => { Y!(); } } #[macro_export] macro_rules! Y { () => {} }\n} // X! 和 Y! 并非在此处定义的,但它们 **的确** 被导出了(在此处可用)\n// 即便 `macros` 模块是私有的 下面(在使用 macs lib 的 crate 中)的代码会正常工作: X!(); // X 在当前 crate 中被定义\n#[macro_use] extern crate macs; // 从 `macs` 中导入 X\nX!(); // 这里的 X 是最新声明的 X,即 `macs` crate 中导入的 X\n# # fn main() {} 正如 作用域 一章所说,#[macro_use] 作用于 extern crate 时, 会强制把导出的宏提到 crate 的顶层模块(根模块),所以这里无须使用 macs::macros 路径。 注意:只有在根模组中,才可将 #[macro_use] 用于 extern crate。 在从 extern crate 导入宏时,可显式控制导入 哪些 宏。 从而利用这一特性来限制命名空间污染,或是覆盖某些特定的宏。就像这样: // 只导入 `X!` 这一个宏\n#[macro_use(X)] extern crate macs; // X!(); // X! 已被定义,但 Y! 未被定义。X 与 Y 无关系。 macro_rules! Y { () => {} } X!(); // X 和 Y 都被定义 fn main() {} 当导出宏时,常常出现的情况是,宏定义需要其引用所在 crate 内的非宏符号。 由于 crate 可能被重命名等,我们可以使用一个特殊的替换变量 $crate 。 它总将被扩展为宏定义所在的 crate 的绝对路径(比如 :: macs )。 如果你的编译器版本小于 1.30(即 2018 版之前),那么这招并不适用于宏。 也就是说,你没办法采用类似 $crate::Y! 的代码来引用自己 crate 里的定义的宏。 这表示结合 #[macro_use] 来选择性导入会无法保证某个名称的宏在另一个 crate 导入同名宏时依然可用。 推荐的做法是,在引用非宏名称时,总是采用绝对路径。 这样可以最大程度上避免冲突,包括跟标准库中名称的冲突。","breadcrumbs":"声明宏 » 细节 » 导入/导出宏 » #[macro_export]","id":"76","title":"#[macro_export]"},"77":{"body":"2018 版本让使用 macro_rules! 宏更简单。 因为新版本设法让 Rust 中某些特殊的东西更像正常的 items 。 这意味着我们能以命名空间的方式正确导入和使用宏! 因此,不必使用 #[macro_use] 来导入 来自 extern crate 导出的宏 到全局命名空间, 现在我们这样做就好了: use some_crate::some_macro; fn main() { some_macro!(\"hello\"); // as well as some_crate::some_other_macro!(\"macro world\");\n} 可惜,这只适用于导入外部 crate 的宏; 如果你使用在自己 crate 定义的 macro_rules! 宏, 那么依然需要把 #[macro_use] 添加到宏所定义的模块上来引入模块里面的宏。 因而 作用域规则 就像之前谈论的那样生效。 $crate 前缀(元变量)在 2018 版中可适用于任何东西, 在 1.31 版之后,宏 和类似 item 的东西都能用 $crate 导入了。","breadcrumbs":"声明宏 » 细节 » 导入/导出宏 » 2018 版本","id":"77","title":"2018 版本"},"78":{"body":"RFC : rfcs#1584 Tracking Issue : rust#39412 Feature : #![feature(decl_macro)] 虽然这还未稳定(或者更确切地说,还远未完成),但有人提议建立一个新的声明宏系统,该系统应该取代 macro_rules!,并给其取名为声明宏 2.0、macro、decl_macro 或者更混乱的名称 macros-by-example。 本章只是为了快速浏览当前状态,展示如何使用这个宏系统以及它的不同之处。 这里所描述的一切都不是最终成型的或完整的,因为它们可能会发生变化。","breadcrumbs":"声明宏 » 细节 » macro 2.0 » 声明宏 2.0","id":"78","title":"声明宏 2.0"},"79":{"body":"我们将对前几章中实现的两个宏在 macro 和 macro_rules 的语法之间进行比较: #![feature(decl_macro)] macro_rules! replace_expr_ { ($_t:tt $sub:expr) => { $sub }\n}\nmacro replace_expr($_t:tt $sub:expr) { $sub\n} macro_rules! count_tts_ { () => { 0 }; ($odd:tt $($a:tt $b:tt)*) => { (count_tts!($($a)*) << 1) | 1 }; ($($a:tt $even:tt)*) => { count_tts!($($a)*) << 1 };\n}\nmacro count_tts { () => { 0 }, ($odd:tt $($a:tt $b:tt)*) => { (count_tts!($($a)*) << 1) | 1 }, ($($a:tt $even:tt)*) => { count_tts!($($a)*) << 1 },\n} fn main() {} 它们看起来非常相似,只是有一些不同之处,而且 macro 有两种不同的形式。 让我们先看 count_tts 宏,因为它看起来更像我们习惯看到的样子。虽然它看起来与 macro_rules 的版本几乎相同,但有两个不同之处: 它使用了 macro 关键字 规则分隔符是 , 而不是 ; 不过,macro 还有另一种形式,这是只有一条规则的宏的简写。通过 replace_expr,我们看到,可以用一种更类似于普通函数的方式来编写定义: 直接在宏名字后面编写 matcher 然后去掉一对大括号和 =>,再写 transcriber 调用 macro 所定义的宏,和函数式宏的语法相同,名称后跟 !,再后跟宏输入标记树。","breadcrumbs":"声明宏 » 细节 » macro 2.0 » 语法","id":"79","title":"语法"},"8":{"body":"译者注:牢记“宏”是声明宏和过程宏的统称,而“宏”只是一种“语法拓展”。AST 中的宏其实围绕着标记树。 如前所述,在 Rust 中,宏处理发生 在 AST 生成之后 。因此,调用宏的语法 必须 符合 Rust 语法的一部分。 实际上,Rust 语法包含数种“语法扩展”的形式。具体来说有以下四种(顺便给出例子): # [ $arg ] 形式:比如 #[derive(Clone)], #[no_mangle], … # ! [ $arg ] 形式:比如 #![allow(dead_code)], #![crate_name=\"blang\"], … $name ! $arg 形式:比如 println!(\"Hi!\"), concat!(\"a\", \"b\"), … $name ! $arg0 $arg1 形式:比如 macro_rules! dummy { () => {}; }. 头两种形式被称作“属性” ( attributes )。属性用来给条目 (items) 、表达式、语句加上注解。属性有三类: 内置的属性 ( built-in attributes ) 过程宏属性 ( proc-macro attributes ) 派生属性 ( derive attributes ) 内置的属性由编译器实现。过程宏属性和派生属性在 Rust 第二类宏系统 —— 过程宏 ( procedural macros ) —— 中实现。 我们感兴趣的是第 3 种:$name ! $arg —— 函数式 (function-like) 的宏。这种形式的宏可以通过 macro_rules!、 macro 和过程宏三种方式来使用(或者说定义)。 注意第 3 种形式的函数式宏是一种一般的语法拓展形式,并非仅用 macro_rules! 写出。 比如 format! 是一个 macro_rules! 宏,而用来实现 format! 的 format_args! 不是这里谈论的宏(因为它由编译器实现,是内置的属性)。 第四种形式本质上是宏的变种。其实,这种形式的唯一用例只有 macro_rules!。 所以,请将注意力集中到第 3 种形式 $name ! $arg 上,我们的问题变成,对于每种可能的语法扩展, Rust 的语法解析器 (parser) 如何知道这里的 $arg 究竟长什么样? 答案是它 不需要 知道。其实,提供给语法扩展调用的参数只是 一棵 标记树 (token tree)。 具体来说,是一棵 非叶节点 (non-leaf) 的标记树:即 (...)、[...] 或 {...}。 知道这一点后,语法解析器如何理解如下调用形式,就变得显而易见了: bitflags! { struct Color: u8 { const RED = 0b0001, const GREEN = 0b0010, const BLUE = 0b0100, const BRIGHT = 0b1000, }\n} lazy_static! { static ref FIB_100: u32 = { fn fib(a: u32) -> u32 { match a { 0 => 0, 1 => 1, a => fib(a-1) + fib(a-2) } } fib(100) };\n} fn main() { use Color::*; let colors = vec![RED, GREEN, BLUE]; println!(\"Hello, World!\");\n} 虽然上述调用 看起来 包含了各式各样的 Rust 代码,但对语法解析器来说,它们仅仅是堆无实际意义的标记树。 为了说明问题,我们把所有这些句法“黑盒”用 ⬚ 代替,仅剩下: bitflags! ⬚ lazy_static! ⬚ fn main() { let colors = vec! ⬚; println! ⬚;\n} 再次重申,语法解析器对 ⬚ 不作任何假设;它记录黑盒所包含的标记,但并不尝试理解它们。 这意味着 ⬚ 可以是任何东西,甚至是无效的 Rust 语法。至于为什么这是好事,等会会谈到。 那么,这是否也适用于形式 1 和 2 中的 $arg,以及 4 中的两个参数的情况呢? 有点类似。形式 1 和 2 的 $arg 略有不同,因为它不是直接的标记树,而是后跟 = 标记加字符串表达式或标记树的 简单路径 。过程宏一章将更深入地探讨这一点。这里的重点是,该形式也使用标记树来描述输入。 第 4 种形式通常更特殊,它接受一种非常具体的语法,但这种语法也利用了标记树。这个形式下的具体情况在此处并不重要, 所以在涉及到它之前,暂时跳过它。 以下几点很重要: Rust 包含多种语法扩展。 当遇见形如 $name! $arg 的结构时,它可能是其它语法扩展,比如 macro_rules! 宏、过程宏甚至内置宏。 所有 ! 宏(即第 3 种形式)的输入都是非叶节点的单个标记树。 语法扩展都将作为抽象语法树 (AST) 的 一部分 被解析。 最后一点最为重要,它带来了一些深远的影响。由于语法拓展将被解析进 AST 中,它们 只能 出现在那些明确支持它们出现的位置。具体来说,语法拓展能在如下位置出现: 模式 (pattern) 语句 (statement) 表达式 (expression) 条目 (item) (包括 impl 块) 类型 一些并不支持的位置包括: 标识符 (identifier) match 分支 结构体的字段 在上述第一个列表(支持的位置)之外,绝对没有任何地方有使用语法拓展的可能。","breadcrumbs":"语法拓展 » AST 中的宏 » AST 中的宏","id":"8","title":"AST 中的宏"},"80":{"body":"macro_rules 宏是按文本限定范围的,并且如果将它视为条目,需要 #[macro_export] (而且还可能需要重导出),但 macro 与此不同,因为 macro 宏的行为与规范的条目一样。 因此,你可以使用诸如 pub、pub(crate)、pub(in path) 之类的可见性分类符来适当地限定它们。 [1] 译者注:这也意味着,macro 宏的导入导出规则符合常规条目。","breadcrumbs":"声明宏 » 细节 » macro 2.0 » macro 是规范的条目","id":"80","title":"macro 是规范的条目"},"81":{"body":"到目前为止,卫生性是这两个声明宏系统之间最大的区别。 与具有混合式卫生性 ( mixed site hygiene ) 的 macro_rules 不同,macro 具有定义处卫生性 ( definition site hygiene ),这意味着 macro 不会将标识符泄漏到其调用之外。 这样,下面的代码可以使用 macro_rules 宏进行编译,但无法使用 macro 定义: #![feature(decl_macro)]\n// 试着注释下面第一行,然后取消注释下面第二行,看看会发生什么 macro_rules! foo {\n// macro foo { ($name: ident) => { pub struct $name; impl $name { pub fn new() -> $name { $name } } }\n} foo!(Foo); fn main() { // this fails with a `macro`, but succeeds with a `macro_rules` let foo = Foo::new();\n} 未来可能会有计划允许标识符卫生性逃逸 (hygiene bending)。","breadcrumbs":"声明宏 » 细节 » macro 2.0 » 卫生性","id":"81","title":"卫生性"},"82":{"body":"解析和展开模式。","breadcrumbs":"声明宏 » 模式 » 模式","id":"82","title":"模式"},"83":{"body":"macro_rules! call_with_larch { ($callback:ident) => { $callback!(larch) };\n} macro_rules! expand_to_larch { () => { larch };\n} macro_rules! recognize_tree { (larch) => { println!(\"#1, the Larch.\") }; (redwood) => { println!(\"#2, the Mighty Redwood.\") }; (fir) => { println!(\"#3, the Fir.\") }; (chestnut) => { println!(\"#4, the Horse Chestnut.\") }; (pine) => { println!(\"#5, the Scots Pine.\") }; ($($other:tt)*) => { println!(\"I don't know; some kind of birch maybe?\") };\n} fn main() { recognize_tree!(expand_to_larch!()); // 无法直接使用 `expand_to_larch!` 的展开结果 call_with_larch!(recognize_tree); // 回调就是给另一个宏传入宏的名称 (`ident`),而不是宏的结果\n} // 打印结果:\n// I don't know; some kind of birch maybe?\n// #1, the Larch. 由于宏展开的机制限制,(至少在最新的 Rust 中) 不可能做到把一例宏的展开结果作为有效信息提供给另一例宏。 这为宏的模块化工作施加了难度。 使用递归并传递回调 (callbacks) 是条出路。 作为演示,上例两处宏调用的展开过程如下: recognize_tree! { expand_to_larch ! ( ) }\nprintln! { \"I don't know; some kind of birch maybe?\" }\n// ... call_with_larch! { recognize_tree }\nrecognize_tree! { larch }\nprintln! { \"#1, the Larch.\" }\n// ... 可以反复匹配 tt 来将任意参数转发给回调: macro_rules! callback { ($callback:ident( $($args:tt)* )) => { $callback!( $($args)* ) };\n} fn main() { callback!(callback(println(\"Yes, this *was* unnecessary.\")));\n} 如果需要的话,当然还可以在参数中增加额外的标记 (tokens) 。","breadcrumbs":"声明宏 » 模式 » 回调 » 回调","id":"83","title":"回调"},"84":{"body":"译者注:原文标题为 incremental TT muncher 。 macro_rules! mixed_rules { () => {}; (trace $name:ident; $($tail:tt)*) => { { println!(concat!(stringify!($name), \" = {:?}\"), $name); mixed_rules!($($tail)*); } }; (trace $name:ident = $init:expr; $($tail:tt)*) => { { let $name = $init; println!(concat!(stringify!($name), \" = {:?}\"), $name); mixed_rules!($($tail)*); } };\n}\n# # fn main() {\n# let a = 42;\n# let b = \"Ho-dee-oh-di-oh-di-oh!\";\n# let c = (false, 2, 'c');\n# mixed_rules!(\n# trace a;\n# trace b;\n# trace c;\n# trace b = \"They took her where they put the crazies.\";\n# trace b;\n# );\n# } 此模式可能是 最强大 的宏解析技巧。通过使用它,一些极其复杂的语法都能得到解析。 “标记树撕咬机” (TT muncher) 是一种递归宏,其工作机制有赖于对输入的顺次、逐步处理 (incrementally processing) 。处理过程的每一步中,它都将匹配并移除(“撕咬”掉)输入头部 (start) 的一列标记 (tokens),得到一些中间结果,然后再递归地处理输入剩下的尾部。 名称中含有“标记树”,是因为输入中尚未被处理的部分总是被捕获在 $($tail:tt)* 的形式中。之所以如此,是因为只有通过使用反复匹配 tt 才能做到 无损地 (losslessly) 捕获住提供给宏的输入部分。 标记树撕咬机仅有的限制,也是整个宏系统的局限: 你只能匹配 macro_rules! 捕获到的字面值和语法结构。 你无法匹配不成对的标记组 (unbalanced group) 。 然而,需要把宏递归的局限性纳入考量。macro_rules! 没有做任何形式的尾递归消除或优化。 在写标记树撕咬机时,建议多花些功夫,尽可能地限制递归调用的次数。 以下两种做法帮助你做到限制宏递归: 对于输入的变化,增加额外的匹配规则(而不是采用中间层并使用递归) [1] ; 对输入句法施加限制,以便于记录追踪标准式的反复匹配。 例子见 计数-递归","breadcrumbs":"声明宏 » 模式 » tt “撕咬机“ » 增量式 TT “撕咬机”","id":"84","title":"增量式 TT “撕咬机”"},"85":{"body":"译者注:要点是 可以一次处理很多标记来减少递归次数(比如运用反复匹配) 可以编写规则简单的宏,然后多次调用 把容易匹配到的规则放到前面,以减少匹配次数(因为规则顺序决定了匹配顺序) TT 撕咬机天生就是二次复杂度的。考虑一个 TT 撕咬机 规则,它消耗一个标记树,然后递归地在其余输入上调用自身。如果向其传递 100 个标记树: 初始调用将匹配所有的 100 个标记树。 第 1 个递归调用将匹配 99 个标记树。 下一次递归调用将匹配 98 个标记树。 依此类推,直到匹配最后 1 个标记树。 这是一个典型的二次复杂度模式,过长的输入会导致宏展开延长编译时间。 因此,尽量避免过多地使用 TT 撕咬机,特别是在输入较长的情况下。 recursion_limit 属性的缺省值 (目前是 128 ) 是一个良好的健全性检查;如果你必须超过它,那么可能会遇到麻烦。 建议是,你可以选择编写一个: 一次调用就能处理多件事情的 TT 撕咬机 或者多次调用来处理一件事情的更简单的宏(这种宏从性能角度看,是更推荐的做法) 例如,别这样写: # macro_rules! f { ($($tt:tt)*) => {} }\nf! { fn f_u8(x: u32) -> u8; fn f_u16(x: u32) -> u16; fn f_u32(x: u32) -> u32; fn f_u64(x: u64) -> u64; fn f_u128(x: u128) -> u128;\n} 应该这样写: # macro_rules! f { ($($tt:tt)*) => {} }\nf! { fn f_u8(x: u32) -> u8; }\nf! { fn f_u16(x: u32) -> u16; }\nf! { fn f_u32(x: u32) -> u32; }\nf! { fn f_u64(x: u64) -> u64; }\nf! { fn f_u128(x: u128) -> u128; } 宏的输入越长,第二种编写方式就越有可能缩短编译时间。 此外,如果 TT 撕咬机有许多规则,请 尽可能把最频繁匹配的规则放到前面 。这避免了不必要的匹配失败。(事实上,这对任何类型的声明性宏都是很好的建议,而不仅仅是 TT 撕咬机。) 最后,优先使用正常的反复匹配(* 或 +)来编写宏,这比 TT 撕咬机更好。如果每次调用 TT 撕咬机时,一次只处理一个标记,则最有可能出现这种情况。 在更复杂的情况下,可以参考 quote! 使用的一种高级技术,它可以避免二次复杂度,而且不会达到递归上限,但代价是一些复杂的概念。详情请参考 此处 。","breadcrumbs":"声明宏 » 模式 » tt “撕咬机“ » 性能建议","id":"85","title":"性能建议"},"86":{"body":"#[macro_export]\nmacro_rules! foo { (@as_expr $e:expr) => {$e}; ($($tts:tt)*) => { foo!(@as_expr $($tts)*) };\n}\n# # fn main() {\n# assert_eq!(foo!(42), 42);\n# } 内用规则可用在以下两种情况: 将多个宏统一为一个; 通过显式命名宏中调用的规则,来简化 TT “撕咬机” 的读写。 那么为什么将多个宏统一为一个有用呢? 主要原因是:在 2015 版本中,未对宏进行空间命名。这导致一个问题——必须重新导出内部定义的所有宏, 从而污染整个全局宏命名空间;更糟糕的是,宏与其他 crate 的同名宏发生冲突。 简而言之,这很造成很多麻烦。 幸运的是,在 rustc版本 >= 1.30 的情况下(即 2018 版本之后), 这不再是问题了(但是内用规则可以减少不必要声明的宏), 有关宏导出更多信息,请参阅本书 导入/导出宏 。 好了,让我们讨论如何利用“内用规则” (internal rules) 来把多个宏统一为一个, 以及“内用规则”这项技术到底是什么吧。 这个例子有两个宏,一个常见的 as_expr! 宏 和 foo! 宏,后者使用了前者。如果分开写就是下面的形式: #[macro_export]\nmacro_rules! as_expr { ($e:expr) => {$e} } #[macro_export]\nmacro_rules! foo { ($($tts:tt)*) => { as_expr!($($tts)*) };\n}\n# # fn main() {\n# assert_eq!(foo!(42), 42);\n# } 这当然不是最好的解决办法,正如前面提到的,因为 as_expr 污染了全局宏命名空间。 在这个特定的例子里,as_expr 只是一个简单的宏,它只会被使用一次, 所以,利用内用规则,把它“嵌入”到 foo 这个宏里面吧! 在 foo 仅有的一条规则前面添加一条新匹配模式(新规则), 这个匹配模式由 as_expr 组成(和命名),然后附加上宏的输入参数 $e:expr ; 在展开里填写这个宏被匹配到时具体的内容。从而得到本章开头的代码: #[macro_export]\nmacro_rules! foo { (@as_expr $e:expr) => {$e}; ($($tts:tt)*) => { foo!(@as_expr $($tts)*) };\n}\n# # fn main() {\n# assert_eq!(foo!(42), 42);\n# } 可以看到,没有调用 as_expr 宏,而是递归调用在参数前放置了特殊标记树的 foo!(@as_expr $($tts)*)。 要是你看得仔细些,你甚至会发现这个模式能好地结合 TT 撕咬机 ! 之所以用 @ ,是因为在 Rust 1.2 下,该标记尚无任何在前缀位置的用法; 因此,这个语法定义在当时不会与任何东西撞车。 如果你想用别的符号或特有前缀都可以(比如试试 #、! ), 但 @ 的用例已被传播开来,因此,使用它可能更容易帮助读者理解你的代码。 注意:@ 符号很早之前曾作为前缀被用于表示被垃圾回收了的指针, 那时 Rust 还在采用各种记号代表指针类型。 而现在的 @ 只有一种用法: 将名称绑定至模式中(譬如 match 的模式匹配中)。 在这种用法中它是中缀运算符,与我们的上述用例并不冲突。 还有一点要注意,内用规则通常应排在“真正的”规则之前。 这样做可避免 macro_rules! 错把内用规则调用解析成别的东西,比如表达式。","breadcrumbs":"声明宏 » 模式 » 内用规则 » 内用规则","id":"86","title":"内用规则"},"87":{"body":"内用规则的一个缺点是它们会增加编译时间。 即便最终只有一条规则的宏可以匹配(有效的)宏调用,但编译器必须尝试按顺序匹配所有规则。 如果宏有许多规则,则可能会有许多匹配失败的情况,而使用内部规则会增加此类匹配失败的数量。 此外,@as_expr 方式的标识符使规则变得更长,这略微增加了编译器在匹配时必须做的工作量。 因此,为了获得最佳性能, 最好避免使用内部规则 。 避免使用它们通常也会使复杂的宏更易于阅读。","breadcrumbs":"声明宏 » 模式 » 内用规则 » 性能建议","id":"87","title":"性能建议"},"88":{"body":"macro_rules! init_array { (@accum (0, $_e:expr) -> ($($body:tt)*)) => {init_array!(@as_expr [$($body)*])}; (@accum (1, $e:expr) -> ($($body:tt)*)) => {init_array!(@accum (0, $e) -> ($($body)* $e,))}; (@accum (2, $e:expr) -> ($($body:tt)*)) => {init_array!(@accum (1, $e) -> ($($body)* $e,))}; (@accum (3, $e:expr) -> ($($body:tt)*)) => {init_array!(@accum (2, $e) -> ($($body)* $e,))}; (@as_expr $e:expr) => {$e}; [$e:expr; $n:tt] => { { let e = $e; init_array!(@accum ($n, e.clone()) -> ()) } };\n} let strings: [String; 3] = init_array![String::from(\"hi!\"); 3];\n# assert_eq!(format!(\"{:?}\", strings), \"[\\\"hi!\\\", \\\"hi!\\\", \\\"hi!\\\"]\"); 在 Rust 中,所有宏最终 必须 展开为一个完整、有效的句法元素(比如表达式、条目等等)。 这意味着,不可能定义一个最终展开为残缺构造的宏。 有些人可能希望,上例中的宏能被更加直截了当地表述成: macro_rules! init_array { (@accum 0, $_e:expr) => {/* empty */}; (@accum 1, $e:expr) => {$e}; (@accum 2, $e:expr) => {$e, init_array!(@accum 1, $e)}; (@accum 3, $e:expr) => {$e, init_array!(@accum 2, $e)}; [$e:expr; $n:tt] => { { let e = $e; [init_array!(@accum $n, e)] } };\n} 他们预期的展开过程如下: [init_array!(@accum 3, e)] [e, init_array!(@accum 2, e)] [e, e, init_array!(@accum 1, e)] [e, e, e] 然而,这一思路中,每个中间步骤的展开结果都是一个不完整的表达式。 即便这些中间结果对外部来说绝不可见,Rust 仍然禁止这种用法。 下推累积 (push-down accumulation) 则使我们得以在完全完成之前毋需考虑构造的完整性, 进而累积构建出我们所需的标记序列。 本章开头给出的示例中,宏调用的展开过程如下: init_array! { String:: from ( \"hi!\" ) ; 3 }\ninit_array! { @ accum ( 3 , e . clone ( ) ) -> ( ) }\ninit_array! { @ accum ( 2 , e.clone() ) -> ( e.clone() , ) }\ninit_array! { @ accum ( 1 , e.clone() ) -> ( e.clone() , e.clone() , ) }\ninit_array! { @ accum ( 0 , e.clone() ) -> ( e.clone() , e.clone() , e.clone() , ) }\ninit_array! { @ as_expr [ e.clone() , e.clone() , e.clone() , ] } 可以修改一下代码,看到每次调用时 $($body)* 存储的内容变化: macro_rules! init_array { (@accum (0, $_e:expr) -> ($($body:tt)*)) => {init_array!(@as_expr [$($body)*])}; (@accum (1, $e:expr) -> ($($body:tt)*)) => {init_array!(@accum (0, $e) -> ($($body)* $e+3,))}; (@accum (2, $e:expr) -> ($($body:tt)*)) => {init_array!(@accum (1, $e) -> ($($body)* $e+2,))}; (@accum (3, $e:expr) -> ($($body:tt)*)) => {init_array!(@accum (2, $e) -> ($($body)* $e+1,))}; (@as_expr $e:expr) => {$e}; [$e:expr; $n:tt $(; first $init:expr)?] => { { let e = $e; init_array!(@accum ($n, e.clone()) -> ($($init)?,)) } };\n} fn main() { let array: [usize; 4] = init_array![0; 3; first 0]; println!(\"{:?}\", array);\n} 根据 调试 一章的内容, 在 nightly Rust 中使用编译命令: cargo rustc --bin my-project -- -Z trace-macros ,即得到以下输出: note: trace_macro --> src/main.rs:20:31 |\n20 | let array: [usize; 4] = init_array![0; 3; first 0]; | ^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: expanding `init_array! { 0 ; 3 ; first 0 }` = note: to `{ let e = 0 ; init_array! (@ accum(3, e.clone()) -> (0,)) }` = note: expanding `init_array! { @ accum(3, e.clone()) -> (0,) }` = note: to `init_array! (@ accum(2, e.clone()) -> (0, e.clone() + 1,))` = note: expanding `init_array! { @ accum(2, e.clone()) -> (0, e.clone() + 1,) }` = note: to `init_array! (@ accum(1, e.clone()) -> (0, e.clone() + 1, e.clone() + 2,))` = note: expanding `init_array! { @ accum(1, e.clone()) -> (0, e.clone() + 1, e.clone() + 2,) }` = note: to `init_array! (@ accum(0, e.clone()) -> (0, e.clone() + 1, e.clone() + 2, e.clone() + 3,))` = note: expanding `init_array! { @ accum(0, e.clone()) -> (0, e.clone() + 1, e.clone() + 2, e.clone() + 3,) }` = note: to `init_array! (@ as_expr [0, e.clone() + 1, e.clone() + 2, e.clone() + 3,])` = note: expanding `init_array! { @ as_expr [0, e.clone() + 1, e.clone() + 2, e.clone() + 3,] }` = note: to `[0, e.clone() + 1, e.clone() + 2, e.clone() + 3]` 可以看到,每一步都在累积输出,直到规则完成,给出完整的表达式。 上述过程的关键点在于,使用 $($body:tt)* 来保存输出中间值, 而不触发其它解析机制。采用 ($input) -> ($output) 的形式仅是出于传统,用以明示此类宏的作用。 由于可以存储任意复杂的中间结果, 下推累积在构建 TT 撕咬机 的过程中经常被用到。 当构造类似于这个例子的宏时,也会结合 内用规则 。","breadcrumbs":"声明宏 » 模式 » 下推累积 » 下推累积","id":"88","title":"下推累积"},"89":{"body":"下推累积本质上是二次复杂度的。考虑一个包含 100 个标记树的累加器 [1] ,每次调用一个标记树: 初始调用将匹配空的累加器 调用第一个递归将匹配 1 个标记树累加器 调用下一个递归将匹配 2 个标记树累加器 以此类推,最多 100 个 这是一个典型的二次复杂度模式,长输入会导致宏延长编译时间。 此外,TT 撕咬机对其输入也是天生的二次复杂度,所以同时使用 TT 撕咬机和下推累积的宏将是双倍二次的! 所有关于 TT 撕咬机的 性能建议 都适用于下推积累。 一般来说,避免过多地使用它们,并尽可能地让它们的简单。 最后,确保将累加器放在规则的末尾,而不是开头。 这样,如果匹配规则失败,编译器就不必匹配(可能很长的)累加器,从而避免遇到规则中不匹配的部分。这可能会对编译时间产生很大影响。 译者注:accumulator,即使用下推累积方式编写的声明宏。","breadcrumbs":"声明宏 » 模式 » 下推累积 » 性能建议","id":"89","title":"性能建议"},"9":{"body":"展开相对简单。在生成 AST 之后 ,和编译器对程序进行语义理解之前,编译器将会对所有语法拓展进行展开。 这一过程包括:遍历 AST,确定所有语法拓展调用的位置,并把它们替换成展开的内容。 每当编译器遇见一个语法扩展,都会根据上下文解析成有限语法元素集中的一个。 举例来说,如果在模块作用域内调用语法拓展,那么编译器就将它的展开结果解析为表示某项条目 (item) 的 AST 节点;如果在表达式的位置上调用语法拓展,那么编译器就将它的展开结果解析为表示表达式的 AST 节点。 事实上,一个语义扩展的展开结果会变成以下一种情况: 一个表达式 一个模式 一个类型 零或多个条目(包括的 impl 块) 零或多个语句 换句话讲,语法拓展调用所在的位置,决定了该语法拓展展开结果被解读的方式。 编译器会操作 AST 节点,把语法拓展调用处的节点完全替换成输出的节点。这一替换是结构性 (structural) 的,而非织构性 (textural) 的。 比如思考以下代码: let eight = 2 * four!(); 我们可将这部分 AST 可视化地表示为: ┌─────────────┐\n│ Let │\n│ name: eight │ ┌─────────┐\n│ init: ◌ │╶─╴│ BinOp │\n└─────────────┘ │ op: Mul │ ┌╴│ lhs: ◌ │ ┌────────┐ │ │ rhs: ◌ │╶┐ ┌────────────┐ │ LitInt │╶┘ └─────────┘ └╴│ Macro │ │ val: 2 │ │ name: four │ └────────┘ │ body: () │ └────────────┘ 根据上下文,four!() 必须 展开成一个表达式(initializer 只可能是表达式)。因此,无论实际展开的结果如何,它都将被解读成一个完整的表达式。 此处假设 four! 成其展开结果为表达式 1 + 3。故而,展开后将 AST 变为: ┌─────────────┐\n│ Let │\n│ name: eight │ ┌─────────┐\n│ init: ◌ │╶─╴│ BinOp │\n└─────────────┘ │ op: Mul │ ┌╴│ lhs: ◌ │ ┌────────┐ │ │ rhs: ◌ │╶┐ ┌─────────┐ │ LitInt │╶┘ └─────────┘ └╴│ BinOp │ │ val: 2 │ │ op: Add │ └────────┘ ┌╴│ lhs: ◌ │ ┌────────┐ │ │ rhs: ◌ │╶┐ ┌────────┐ │ LitInt │╶┘ └─────────┘ └╴│ LitInt │ │ val: 1 │ │ val: 3 │ └────────┘ └────────┘ 这又能被重写成: let eight = 2 * (1 + 3); 注意,虽然表达式本身不包含括号,但这里仍然加上了它们。这是因为,编译器总是将语法拓展的展开结果看作完整的 AST 节点,而 不是 仅仅把它视为一列标记。 换句话说,即便不显式地把复杂的表达式用括号包起来,编译器也不可能“错意”语法拓展替换的结果,或者改变求值顺序。 语法拓展被当作 AST 节点展开,这一观点非常重要,它造成两大影响: 语法拓展不仅调用位置有限制,其展开结果也只能跟语法解析器在该位置所预期的 AST 节点种类一致。 因此,语法拓展 必定无法 展开成不完整或不合语法的结构。 有关展开还有一点值得注意:如果某语法扩展的展开结果包含 另一个 语法扩展调用,那会怎么样? 例如,上述 four! 如果被展开成了 1 + three!(),会发生什么? let x = four!(); 展开成: let x = 1 + three!(); 编译器将会检查扩展结果中是否包含更多的语法拓展调用;如果有,它们将被进一步展开。 因此,上述 AST 节点将被再次展开成: let x = 1 + 3; 这里的要点是,语法拓展展开发生在“传递”过程中;要完全展开所有调用,就需要同样多的传递。 嗯,也不全是如此。事实上,编译器为此设置了一个上限。它被称作语法拓展的递归上限,默认值为 128。如果第 128 次展开结果仍然包含语法拓展调用,编译器将会终止并返回一个递归上限溢出的错误信息。 此上限可通过 #![recursion_limit=\"…\"] 来提高,但这种改写必须是 crate 级别的。 一般来讲,可能的话最好还是尽量让语法拓展展开递归次数保持在默认值以下,因为会影响编译时间。","breadcrumbs":"语法拓展 » 宏展开 » 展开","id":"9","title":"展开"},"90":{"body":"macro_rules! replace_expr { ($_t:tt $sub:expr) => {$sub};\n} 在上面代码的模式中,匹配到的重复序列将被直接丢弃, 仅留用它所带来的长度信息(以及元素的类型信息); 且原本标记所在的位置将被替换成某种重复元素。 举个例子,考虑如何为一个元素多于12个 (Rust 1.2 下的元组元素个数的最大值) 的 tuple 提供默认值。 macro_rules! tuple_default { ($($tup_tys:ty),*) => { ( $( replace_expr!( ($tup_tys) Default::default() ), )* ) };\n} macro_rules! replace_expr { ($_t:tt $sub:expr) => { $sub };\n} fn main() { assert_eq!(tuple_default!(i32, bool, String), (i32::default(), bool::default(), String::default()));\n} 仅对此例 : 我们其实可以直接用 $tup_tys::default() 。 上例中,我们 并未真正使用 匹配到的类型。 实际上,我们把它丢弃了,并用一个表达式重复替代 (repetition replacement) 。 换句话说,我们实际关心的不是有哪些类型,而是有多少个类型。","breadcrumbs":"声明宏 » 模式 » 反复替换 » 反复替换","id":"90","title":"反复替换"},"91":{"body":"macro_rules! call_a_or_b_on_tail { ((a: $a:ident, b: $b:ident), call a: $($tail:tt)*) => { $a(stringify!($($tail)*)) }; ((a: $a:ident, b: $b:ident), call b: $($tail:tt)*) => { $b(stringify!($($tail)*)) }; ($ab:tt, $_skip:tt $($tail:tt)*) => { call_a_or_b_on_tail!($ab, $($tail)*) };\n} fn compute_len(s: &str) -> Option { Some(s.len())\n} fn show_tail(s: &str) -> Option { println!(\"tail: {:?}\", s); None\n} fn main() { assert_eq!( call_a_or_b_on_tail!( (a: compute_len, b: show_tail), the recursive part that skips over all these tokens doesn't much care whether we will call a or call b: only the terminal rules care. ), None ); assert_eq!( call_a_or_b_on_tail!( (a: compute_len, b: show_tail), and now, to justify the existence of two paths we will also call a: its input should somehow be self-referential, so let's make it return some eighty-six! ), Some(92) );\n} 在十分复杂的递归宏中,可能需要非常多的参数, 才足以在每层调用之间传递必要的标识符与表达式。 然而,根据实现上的差异,可能存在许多这样的中间层, 它们转发了 (forward) 这些参数,但并没有用到。 因此,将所有这些参数捆绑 (bundle) 在一起,通过分组将其放进单独一棵标记树 tt 里, 可以省事许多。这样一来,那些用不到这些参数的递归层可以直接捕获并替换这棵标记树, 而不需要把整组参数完完全全准准确确地捕获替换掉。 上面的例子把表达式 $a 和 $b 捆绑起来, 然后作为一棵 tt 交由递归规则处理。 随后,终结规则 (terminal rules) 将这组标记解构 (destructure) , 并访问其中的表达式。","breadcrumbs":"声明宏 » 模式 » tt 捆绑 » TT 捆绑","id":"91","title":"TT 捆绑"},"92":{"body":"可重用的宏代码片段 (reusable snippets) 。(也可称作“轮子”)","breadcrumbs":"声明宏 » 构件 » 构件","id":"92","title":"构件"},"93":{"body":"在替换 tt 时,Rust 的解析器并不十分可靠。 当它期望得到某类特定的语法结构时, 如果摆在它面前的是一坨替换后的 tt 标记,就有可能出现问题。 解析器常常直接选择放弃解析,而非尝试去解析它们。 在这类情况中,就要用到 AST 强制转换(简称“强转”)。 #![allow(dead_code)] macro_rules! as_expr { ($e:expr) => {$e} }\nmacro_rules! as_item { ($i:item) => {$i} }\nmacro_rules! as_pat { ($p:pat) => {$p} }\nmacro_rules! as_stmt { ($s:stmt) => {$s} }\nmacro_rules! as_ty { ($t:ty) => {$t} } fn main() { as_item!{struct Dummy;} as_stmt!(let as_pat!(_): as_ty!(_) = as_expr!(42));\n} 这些强制变换经常与 下推累积 宏一同使用, 以使解析器能够将最终输出的 tt 序列当作某类特定的语法结构来对待。 注意:之所以只有这几种强转宏, 是由宏 可以展开成什么 所决定的, 而不是由宏能够捕捉哪些东西所决定的。","breadcrumbs":"声明宏 » 构件 » AST 强制转换 » AST 强制转换","id":"93","title":"AST 强制转换"},"94":{"body":"","breadcrumbs":"声明宏 » 构件 » 计数 » 计数","id":"94","title":"计数"},"95":{"body":"在宏中计数是一项让人吃惊的难搞的活儿。 最简单的方式是采用反复替换 (repetition with replacement) 。 macro_rules! replace_expr { ($_t:tt $sub:expr) => {$sub};\n} macro_rules! count_tts { ($($tts:tt)*) => {0usize $(+ replace_expr!($tts 1usize))*};\n}\n# # fn main() {\n# assert_eq!(count_tts!(0 1 2), 3);\n# } 对于小数目来说,这方法不错,但当输入量到达 500 [1] 左右的标记时, 很可能让编译器崩溃。想想吧,输出的结果将类似: 0usize + 1usize + /* ~500 `+ 1usize`s */ + 1usize 编译器必须把这一大串解析成一棵 AST , 那可会是一棵完美失衡的 500 多级深的二叉树。 译者注:500 这个数据过时了,例子见下面 递归 第三个代码块。","breadcrumbs":"声明宏 » 构件 » 计数 » 反复替换","id":"95","title":"反复替换"},"96":{"body":"递归 (recursion) 是个老套路。 macro_rules! count_tts { () => {0usize}; ($_head:tt $($tail:tt)*) => {1usize + count_tts!($($tail)*)};\n}\n# # fn main() {\n# assert_eq!(count_tts!(0 1 2), 3);\n# } 注意:对于 rustc 1.2 来说,很不幸, 编译器在处理大数量的类型未知的整型字面值时将会出现性能问题。 我们此处显式采用 usize 类型就是为了避免这种不幸。 如果这样做并不合适(比如说,当类型必须可替换时), 可通过 as 来减轻问题。(比如, 0 as $ty、1 as $ty 等)。 这方法管用,但很快就会超出宏递归的次数限制( 目前 是 128 )。 与重复替换不同的是,可通过增加匹配分支来增加可处理的输入面值。 以下为增加匹配分支的改进代码 [2] ,如果把前三个分支注释掉,看看编译器会提示啥 :) macro_rules! count_tts { ($_a:tt $_b:tt $_c:tt $_d:tt $_e:tt $_f:tt $_g:tt $_h:tt $_i:tt $_j:tt $_k:tt $_l:tt $_m:tt $_n:tt $_o:tt $_p:tt $_q:tt $_r:tt $_s:tt $_t:tt $($tail:tt)*) => {20usize + count_tts!($($tail)*)}; ($_a:tt $_b:tt $_c:tt $_d:tt $_e:tt $_f:tt $_g:tt $_h:tt $_i:tt $_j:tt $($tail:tt)*) => {10usize + count_tts!($($tail)*)}; ($_a:tt $_b:tt $_c:tt $_d:tt $_e:tt $($tail:tt)*) => {5usize + count_tts!($($tail)*)}; ($_a:tt $($tail:tt)*) => {1usize + count_tts!($($tail)*)}; () => {0usize};\n} fn main() { assert_eq!(700, count_tts!( ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ));\n} 可以复制下面的例子运行看看,里面包含递归和反复匹配(代码已隐藏)两种方法。 macro_rules! count_tts { ($_a:tt $_b:tt $_c:tt $_d:tt $_e:tt $_f:tt $_g:tt $_h:tt $_i:tt $_j:tt $_k:tt $_l:tt $_m:tt $_n:tt $_o:tt $_p:tt $_q:tt $_r:tt $_s:tt $_t:tt $($tail:tt)*) => {20usize + count_tts!($($tail)*)}; ($_a:tt $_b:tt $_c:tt $_d:tt $_e:tt $_f:tt $_g:tt $_h:tt $_i:tt $_j:tt $($tail:tt)*) => {10usize + count_tts!($($tail)*)}; ($_a:tt $_b:tt $_c:tt $_d:tt $_e:tt $($tail:tt)*) => {5usize + count_tts!($($tail)*)}; ($_a:tt $($tail:tt)*) => {1usize + count_tts!($($tail)*)}; () => {0usize};\n} // 可试试“反复替代”的方式计数\n// --snippet--\n# // macro_rules! replace_expr {\n# // ($_t:tt $sub:expr) => {\n# // $sub\n# // };\n# // }\n# //\n# // macro_rules! count_tts {\n# // ($($tts:tt)*) => {0usize $(+ replace_expr!($tts 1usize))*};\n# // } fn main() { assert_eq!(2500, count_tts!( ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, // --snippet-- # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# // 默认的递归限制让改进的递归代码也无法继续下去了 // 反复替换的代码还能够运行,但明显效率不会很高 // ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, // ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ));\n} 译者注:如果不显式提高 128 的递归限制的话, 这个例子中,增加匹配分支办法可以处理最多 \\(20 \\times 128 = 2560 \\) 个标记。","breadcrumbs":"声明宏 » 构件 » 计数 » 递归","id":"96","title":"递归"},"97":{"body":"第三种方法,是帮助编译器构建一个深度较小的 AST ,以避免栈溢出。 可以通过构造数组,并调用其 len 方法来做到。(slice length) macro_rules! replace_expr { ($_t:tt $sub:expr) => {$sub};\n} macro_rules! count_tts { ($($tts:tt)*) => {<[()]>::len(&[$(replace_expr!($tts ())),*])};\n} fn main() { assert_eq!(count_tts!(0 1 2), 3); const N: usize = count_tts!(0 1 2); let array = [0; N]; println!(\"{:?}\", array);\n} 经过测试,这种方法可处理高达 10000 个标记数,可能还能多上不少。 [3] 而且可以用于常量表达式,比如当作在 const 值或定长数组的长度值。 [4] 所以基本上此方法是 首选 。 译者注:这个具体的数据可能也过时了,但这个方法的确是高效的。 译者注:原作时这个方法无法用于常量,现在无此限制。","breadcrumbs":"声明宏 » 构件 » 计数 » 切片长度","id":"97","title":"切片长度"},"98":{"body":"当你需要统计 互不相同的标识符 的数量时, 可以利用枚举体的 numeric cast 功能来达到统计成员(即标识符)个数。 macro_rules! count_idents { ($($idents:ident),* $(,)*) => { { #[allow(dead_code, non_camel_case_types)] enum Idents { $($idents,)* __CountIdentsLast } const COUNT: u32 = Idents::__CountIdentsLast as u32; COUNT } };\n}\n# # fn main() {\n# const COUNT: u32 = count_idents!(A, B, C);\n# assert_eq!(COUNT, 3);\n# } 此方法有两大缺陷: 它仅能被用于数有效的标识符(同时还不能是关键词),而且不允许那些标识符有重复 不具备卫生性:如果你的末位标识符(在 __CountIdentsLast [5] 位置上的标识符)的字面值也是输入之一, 那么宏调用就会失败,因为 enum 中包含重复变量。 译者注:__CountIdentsLast 只是一个自定义的标识符,重点在于它处于枚举成员的最后一位。","breadcrumbs":"声明宏 » 构件 » 计数 » 枚举计数","id":"98","title":"枚举计数"},"99":{"body":"另一个递归方法,但是使用了 位操作 (bit operations) [6] : macro_rules! count_tts { () => { 0 }; ($odd:tt $($a:tt $b:tt)*) => { (count_tts!($($a)*) << 1) | 1 }; ($($a:tt $even:tt)*) => { count_tts!($($a)*) << 1 };\n}\n# # fn main() {\n# assert_eq!(count_tts!(0 1 2), 3);\n# } 这种方法非常聪明。 只要它是偶数个,就能有效地将其输入减半, 然后将计数器乘以 2(或者在这种情况下,向左移1位)。 因为由于前一次左移位,此时最低位必须为 0 ,重复直到我们达到基本规则 () => 0 。 如果输入是奇数个,则从第二个输入开始减半,最终将结果进行 或运算(这等效于加 1)。 这样做的好处是,生成计数器的 AST 表达式将以 O(log(n)) 而不是 O(n) 复杂度增长。 请注意,这仍然可能达到递归限制。 让我们手动分析中间的过程: count_tts!(0 0 0 0 0 0 0 0 0 0); 由于我们的标记树数量为偶数(10),因此该调用将与第三条规则匹配。 该匹配分支把奇数项的标记树命名给 $a ,偶数项的标记树命名成 $b , 但是只会对奇数项 $a 展开,这意味着有效地抛弃所有偶数项,切断了一半的输入。 因此,调用现在变为: count_tts!(0 0 0 0 0) << 1; 现在,该调用将匹配第二条规则,因为其输入的令牌树数量为奇数。 在这种情况下,第一个标记树将被丢弃以再次让输入变成偶数个, 然后可以在调用中再次进行减半步骤。 此时,我们可以将奇数时丢弃的一项计数为1,然后再乘以2,因为我们也减半了。 ((count_tts!(0 0) << 1) | 1) << 1; ((count_tts!(0) << 1 << 1) | 1) << 1; (((count_tts!() | 1) << 1 << 1) | 1) << 1; ((((0 << 1) | 1) << 1 << 1) | 1) << 1; 现在,要检查是否正确分析了扩展过程, 我们可以使用 debugging 调试工具。 展开宏后,我们应该得到: ((((0 << 1) | 1) << 1 << 1) | 1) << 1; 没有任何差错,太棒了! 译者注:以下内容为译者自行补充这小节提到的调试。 注意:我这里使用的加、乘运算与上面提到的位运算是一样的。 #![allow(unused)]\nmacro_rules! count_tts { () => { 0 }; ($odd:tt $($a:tt $b:tt)*) => { (count_tts!($($a)*) *2) + 1 }; ($($a:tt $even:tt)*) => { count_tts!($($a)*) *2 };\n} fn main() { count_tts!(0 1 2 3 4 5 6 7 8 9 10);\n} 调试方法(必须在 nightly 版本下): 使用编译命令 cargo rustc -- -Z trace-macros 得到: note: trace_macro --> src/main.rs:9:5 |\n9 | count_tts!(0 1 2 3 4 5 6 7 8 9 10); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: expanding `count_tts! { 0 1 2 3 4 5 6 7 8 9 10 }` = note: to `(count_tts! (1 3 5 7 9) * 2) + 1` = note: expanding `count_tts! { 1 3 5 7 9 }` = note: to `(count_tts! (3 7) * 2) + 1` = note: expanding `count_tts! { 3 7 }` = note: to `count_tts! (3) * 2` = note: expanding `count_tts! { 3 }` = note: to `(count_tts! () * 2) + 1` = note: expanding `count_tts! { }` = note: to `0` 上面的形式太不简洁,所以使用封装好的工具: cargo-expand 。 使用编译命令 cargo expand ,得到: #![feature(prelude_import)]\n#![allow(unused)]\n#[prelude_import]\nuse std::prelude::rust_2018::*;\n#[macro_use]\nextern crate std;\nfn main() { (((((0 * 2) + 1) * 2 * 2) + 1) * 2) + 1;\n} 这种方法的归功于 Reddit 用户 YatoRust 。","breadcrumbs":"声明宏 » 构件 » 计数 » bit twiddling","id":"99","title":"bit twiddling"}},"length":127,"save":true},"fields":["title","body","breadcrumbs"],"index":{"body":{"root":{"0":{".":{".":{"2":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":2,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"df":2,"docs":{"35":{"tf":1.0},"36":{"tf":1.0}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":2,"docs":{"23":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"1":{"2":{"3":{"4":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"_":{"_":{"_":{"_":{"_":{"_":{"0":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"0":{"0":{"0":{"1":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"0":{"0":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"0":{"0":{"0":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":22,"docs":{"10":{"tf":2.23606797749979},"101":{"tf":2.23606797749979},"102":{"tf":1.7320508075688772},"115":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"20":{"tf":1.7320508075688772},"21":{"tf":4.47213595499958},"22":{"tf":3.0},"23":{"tf":5.0},"24":{"tf":2.23606797749979},"35":{"tf":1.0},"36":{"tf":1.7320508075688772},"49":{"tf":2.0},"58":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"79":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"88":{"tf":4.69041575982343},"96":{"tf":1.0},"97":{"tf":1.0},"99":{"tf":4.795831523312719}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":2,"docs":{"95":{"tf":1.4142135623730951},"96":{"tf":2.0}}}}}}},"1":{"+":{"2":{"df":1,"docs":{"6":{"tf":1.0}}},"a":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}},".":{"0":{"df":1,"docs":{"24":{"tf":1.0}},"e":{"df":1,"docs":{"5":{"tf":1.0}}}},"1":{"4":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"2":{"df":4,"docs":{"5":{"tf":1.0},"86":{"tf":1.0},"90":{"tf":1.0},"96":{"tf":1.0}}},"3":{"0":{"df":2,"docs":{"76":{"tf":1.0},"86":{"tf":1.0}}},"1":{"df":1,"docs":{"77":{"tf":1.0}}},"df":0,"docs":{}},"5":{"2":{"df":2,"docs":{"44":{"tf":1.0},"5":{"tf":1.0}}},"4":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"6":{"0":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"0":{"0":{"0":{"df":1,"docs":{"97":{"tf":1.0}}},"df":0,"docs":{}},"df":3,"docs":{"22":{"tf":1.0},"85":{"tf":1.4142135623730951},"89":{"tf":1.4142135623730951}}},"df":5,"docs":{"24":{"tf":2.23606797749979},"38":{"tf":1.4142135623730951},"54":{"tf":2.23606797749979},"57":{"tf":1.0},"99":{"tf":1.7320508075688772}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}}}},"1":{"df":2,"docs":{"57":{"tf":1.0},"60":{"tf":1.0}}},"2":{"0":{"df":1,"docs":{"24":{"tf":1.0}}},"8":{"df":3,"docs":{"85":{"tf":1.0},"9":{"tf":1.4142135623730951},"96":{"tf":1.7320508075688772}}},"df":4,"docs":{"38":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0},"90":{"tf":1.0}}},"3":{"df":3,"docs":{"104":{"tf":1.0},"22":{"tf":1.4142135623730951},"54":{"tf":1.0}}},"4":{"df":1,"docs":{"27":{"tf":1.0}}},"df":40,"docs":{"0":{"tf":1.0},"101":{"tf":2.23606797749979},"102":{"tf":4.358898943540674},"110":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"17":{"tf":1.0},"20":{"tf":2.6457513110645907},"21":{"tf":6.324555320336759},"22":{"tf":4.47213595499958},"23":{"tf":7.54983443527075},"24":{"tf":3.605551275463989},"27":{"tf":1.0},"33":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.7320508075688772},"41":{"tf":1.0},"44":{"tf":1.4142135623730951},"47":{"tf":1.0},"49":{"tf":1.4142135623730951},"5":{"tf":1.0},"54":{"tf":1.0},"58":{"tf":1.0},"6":{"tf":1.0},"68":{"tf":1.4142135623730951},"79":{"tf":2.449489742783178},"8":{"tf":2.23606797749979},"80":{"tf":1.0},"83":{"tf":1.4142135623730951},"84":{"tf":1.0},"85":{"tf":1.4142135623730951},"88":{"tf":4.123105625617661},"89":{"tf":1.4142135623730951},"9":{"tf":2.449489742783178},"95":{"tf":1.4142135623730951},"96":{"tf":1.0},"97":{"tf":1.4142135623730951},"99":{"tf":6.48074069840786}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":2,"docs":{"95":{"tf":1.7320508075688772},"96":{"tf":2.0}},"e":{"`":{"df":1,"docs":{"95":{"tf":1.0}}},"df":0,"docs":{}}}}}},"相":{"df":0,"docs":{},"比":{"df":0,"docs":{},"较":{"df":0,"docs":{},":":{"df":0,"docs":{},"匹":{"df":0,"docs":{},"配":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"2":{".":{"0":{"df":3,"docs":{"125":{"tf":1.0},"3":{"tf":1.0},"78":{"tf":1.0}},"、":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"、":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"78":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"3":{"df":1,"docs":{"33":{"tf":1.0}}},"df":0,"docs":{}},"0":{"1":{"5":{"df":4,"docs":{"123":{"tf":1.0},"73":{"tf":1.4142135623730951},"74":{"tf":1.0},"86":{"tf":1.0}}},"6":{"df":2,"docs":{"0":{"tf":1.0},"123":{"tf":1.0}}},"8":{"df":6,"docs":{"123":{"tf":1.0},"25":{"tf":1.0},"73":{"tf":1.4142135623730951},"76":{"tf":1.0},"77":{"tf":1.7320508075688772},"86":{"tf":1.0}}},"df":0,"docs":{}},"2":{"1":{".":{"0":{"6":{"df":1,"docs":{"126":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"35":{"tf":1.0},"36":{"tf":1.0},"44":{"tf":1.0}}},"2":{".":{"0":{"4":{"df":1,"docs":{"125":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"88":{"tf":1.0},"96":{"tf":1.0}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}}}},"1":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}},"4":{"df":2,"docs":{"24":{"tf":1.0},"54":{"tf":1.0}}},"5":{"6":{"0":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":31,"docs":{"0":{"tf":1.0},"101":{"tf":1.4142135623730951},"102":{"tf":2.6457513110645907},"113":{"tf":1.0},"116":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"20":{"tf":1.4142135623730951},"21":{"tf":4.69041575982343},"22":{"tf":3.872983346207417},"23":{"tf":4.47213595499958},"24":{"tf":1.7320508075688772},"27":{"tf":1.0},"28":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.7320508075688772},"44":{"tf":1.0},"48":{"tf":1.0},"5":{"tf":1.0},"57":{"tf":2.6457513110645907},"6":{"tf":1.0},"68":{"tf":1.4142135623730951},"8":{"tf":1.7320508075688772},"84":{"tf":1.0},"88":{"tf":3.872983346207417},"89":{"tf":1.0},"9":{"tf":2.0},"95":{"tf":1.0},"96":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951},"99":{"tf":3.7416573867739413}},"相":{"df":0,"docs":{},"比":{"df":0,"docs":{},"较":{"df":0,"docs":{},":":{"df":0,"docs":{},"匹":{"df":0,"docs":{},"配":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"(":{"df":0,"docs":{},"或":{"df":0,"docs":{},"者":{"df":0,"docs":{},"在":{"df":0,"docs":{},"这":{"df":0,"docs":{},"种":{"df":0,"docs":{},"情":{"df":0,"docs":{},"况":{"df":0,"docs":{},"下":{"df":0,"docs":{},",":{"df":0,"docs":{},"向":{"df":0,"docs":{},"左":{"df":0,"docs":{},"移":{"1":{"df":1,"docs":{"99":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}}}},"3":{".":{"1":{"4":{"1":{"5":{"9":{"df":1,"docs":{"17":{"tf":1.0}},"f":{"3":{"2":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"]":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"22":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"22":{"tf":1.0}}},"6":{"2":{"8":{"8":{"0":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"df":1,"docs":{"104":{"tf":1.4142135623730951}}},"df":24,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"102":{"tf":2.6457513110645907},"117":{"tf":1.0},"122":{"tf":1.0},"15":{"tf":1.4142135623730951},"17":{"tf":1.0},"20":{"tf":1.0},"22":{"tf":1.4142135623730951},"23":{"tf":1.4142135623730951},"35":{"tf":1.0},"36":{"tf":1.7320508075688772},"38":{"tf":3.3166247903554},"46":{"tf":1.0},"5":{"tf":1.0},"68":{"tf":1.4142135623730951},"8":{"tf":2.0},"88":{"tf":4.0},"9":{"tf":2.0},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.4142135623730951},"98":{"tf":1.0},"99":{"tf":3.1622776601683795}}},"4":{".":{"0":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}},"0":{"3":{"2":{"0":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"5":{"tf":1.0}}},"2":{"df":7,"docs":{"10":{"tf":1.7320508075688772},"106":{"tf":1.0},"24":{"tf":2.0},"5":{"tf":1.0},"54":{"tf":2.0},"84":{"tf":1.0},"86":{"tf":1.7320508075688772}},"i":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":10,"docs":{"102":{"tf":4.47213595499958},"15":{"tf":1.4142135623730951},"18":{"tf":1.0},"20":{"tf":1.0},"24":{"tf":1.0},"5":{"tf":1.0},"8":{"tf":1.4142135623730951},"88":{"tf":1.4142135623730951},"97":{"tf":1.0},"99":{"tf":1.7320508075688772}}},"5":{"0":{"0":{"df":1,"docs":{"95":{"tf":2.0}}},"4":{"0":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"16":{"tf":1.0},"22":{"tf":1.4142135623730951},"98":{"tf":1.0},"99":{"tf":2.23606797749979}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}}}},"6":{"8":{"df":1,"docs":{"23":{"tf":2.0}}},"df":4,"docs":{"17":{"tf":1.4142135623730951},"24":{"tf":1.0},"46":{"tf":1.4142135623730951},"99":{"tf":2.0}}},"7":{"2":{"0":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{},"u":{"3":{"2":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"5":{"df":1,"docs":{"22":{"tf":1.0}}},"df":1,"docs":{"99":{"tf":2.6457513110645907}}},"8":{"df":4,"docs":{"22":{"tf":1.4142135623730951},"38":{"tf":1.0},"57":{"tf":1.0},"99":{"tf":1.7320508075688772}}},"9":{"8":{"df":1,"docs":{"85":{"tf":1.0}}},"9":{"df":1,"docs":{"85":{"tf":1.0}}},"df":3,"docs":{"27":{"tf":1.0},"57":{"tf":1.4142135623730951},"99":{"tf":2.449489742783178}}},"_":{"0":{"df":1,"docs":{"23":{"tf":2.449489742783178}}},"1":{"df":1,"docs":{"23":{"tf":2.23606797749979}}},"2":{"df":1,"docs":{"23":{"tf":2.0}}},"3":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}},"_":{"_":{"_":{"_":{"df":1,"docs":{"57":{"tf":1.0}},"o":{"_":{"_":{"_":{"_":{"_":{"df":1,"docs":{"30":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"0":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"98":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"a":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.8284271247461903}}}}},"df":0,"docs":{}},"b":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.449489742783178}}}}},"df":0,"docs":{}},"c":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.449489742783178}}}}},"df":0,"docs":{}},"d":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.449489742783178}}}}},"df":0,"docs":{}},"df":10,"docs":{"106":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"30":{"tf":1.4142135623730951},"32":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"5":{"tf":1.0},"56":{"tf":1.0},"58":{"tf":2.449489742783178},"61":{"tf":1.4142135623730951}},"e":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"88":{"tf":1.7320508075688772}}}}}},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.449489742783178}}}}},"df":0,"docs":{}},"f":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.0}}}}},"df":0,"docs":{}},"g":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.0}}}}},"df":0,"docs":{}},"h":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.0}}}}},"df":0,"docs":{},"e":{"a":{"d":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"i":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.0}}}}},"df":0,"docs":{}},"j":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.0}}}}},"df":0,"docs":{}},"k":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"l":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"m":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"n":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"o":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"p":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"q":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"r":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"s":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"91":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"t":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":5,"docs":{"79":{"tf":1.0},"90":{"tf":1.4142135623730951},"95":{"tf":1.0},"96":{"tf":1.7320508075688772},"97":{"tf":1.0}}}}},"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"60":{"tf":1.0}}}}},"df":0,"docs":{}}}},"a":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"y":{"!":{"(":{"$":{"(":{"$":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"91":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}},":":{":":{"b":{":":{":":{"c":{":":{":":{"d":{"df":1,"docs":{"37":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"i":{"d":{"df":3,"docs":{"24":{"tf":1.0},"54":{"tf":1.0},"91":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"t":{"df":3,"docs":{"46":{"tf":1.0},"79":{"tf":2.0},"99":{"tf":2.0}}}}},"[":{"df":0,"docs":{},"n":{"df":4,"docs":{"21":{"tf":7.280109889280518},"22":{"tf":4.0},"23":{"tf":4.795831523312719},"24":{"tf":1.4142135623730951}}}},"b":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"91":{"tf":1.0}}}}},"a":{"c":{"df":0,"docs":{},"u":{"df":2,"docs":{"101":{"tf":2.0},"102":{"tf":2.8284271247461903}},"s":{"!":{"(":{"$":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"101":{"tf":1.0}}}}}},"(":{"$":{"(":{"$":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"101":{"tf":2.0},"102":{"tf":2.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"57":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"(":{"0":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}},"1":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}},"3":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":1,"docs":{"88":{"tf":4.0}},"u":{"df":0,"docs":{},"l":{"df":3,"docs":{"39":{"tf":1.0},"88":{"tf":1.0},"89":{"tf":1.0}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"115":{"tf":1.0},"117":{"tf":1.0}}}}}},"d":{"d":{"df":3,"docs":{"6":{"tf":1.0},"7":{"tf":2.0},"9":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"46":{"tf":1.4142135623730951}}}}},"df":1,"docs":{"23":{"tf":2.449489742783178}}},"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"(":{"d":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"c":{"df":0,"docs":{},"o":{"d":{"df":4,"docs":{"106":{"tf":1.0},"8":{"tf":1.0},"93":{"tf":1.0},"98":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"99":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":4,"docs":{"22":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"!":{"(":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"45":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"115":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"y":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"48":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"i":{"]":{"[":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"121":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"119":{"tf":1.0}}}},"r":{"df":0,"docs":{},"g":{"0":{"df":2,"docs":{"11":{"tf":1.0},"8":{"tf":1.0}}},"1":{"df":1,"docs":{"8":{"tf":1.0}}},"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"104":{"tf":1.0}},"e":{":":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"104":{"tf":1.0}}},"y":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"104":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":2,"docs":{"8":{"tf":3.0},"83":{"tf":1.0}},"s":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"83":{"tf":1.0}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.0},"41":{"tf":1.0}}}}}}}},"r":{"a":{"df":0,"docs":{},"y":{"df":2,"docs":{"88":{"tf":1.7320508075688772},"97":{"tf":1.4142135623730951}}}},"df":1,"docs":{"7":{"tf":1.0}}}},"s":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"!":{"(":{"$":{"(":{"$":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"86":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"2":{"df":1,"docs":{"93":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"86":{"tf":2.8284271247461903},"87":{"tf":1.0},"88":{"tf":2.23606797749979},"93":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"!":{"df":0,"docs":{},"{":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"93":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":1,"docs":{"93":{"tf":1.0}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"_":{"df":1,"docs":{"93":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"93":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"93":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":1,"docs":{"93":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"93":{"tf":1.0}}},"y":{"!":{"(":{"_":{"df":1,"docs":{"93":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"34":{"tf":1.0},"37":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"!":{"(":{"2":{"5":{"0":{"0":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"0":{"0":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"0":{"df":1,"docs":{"23":{"tf":2.449489742783178}}},"1":{"df":1,"docs":{"23":{"tf":2.23606797749979}}},"2":{"df":1,"docs":{"23":{"tf":2.0}}},"3":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"!":{"(":{"0":{"df":4,"docs":{"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"98":{"tf":1.0}}}}}}},"df":1,"docs":{"17":{"tf":1.0}},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"101":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"!":{"(":{"4":{"2":{"df":1,"docs":{"86":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"(":{"1":{"3":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"88":{"tf":1.0}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"90":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"x":{"df":1,"docs":{"70":{"tf":2.23606797749979}}}},"df":0,"docs":{}},"df":1,"docs":{"91":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"t":{"df":14,"docs":{"14":{"tf":1.0},"16":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"27":{"tf":1.0},"46":{"tf":1.4142135623730951},"6":{"tf":1.7320508075688772},"7":{"tf":2.23606797749979},"8":{"tf":2.0},"9":{"tf":3.1622776601683795},"93":{"tf":1.4142135623730951},"95":{"tf":1.0},"97":{"tf":1.0},"99":{"tf":1.0}}},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"30":{"tf":1.0}}},"df":0,"docs":{}}},"、":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"44":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"50":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"48":{"tf":1.0}}}}}},"r":{"df":1,"docs":{"115":{"tf":1.7320508075688772}},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":7,"docs":{"104":{"tf":1.0},"106":{"tf":2.23606797749979},"107":{"tf":1.4142135623730951},"117":{"tf":1.0},"34":{"tf":1.0},"46":{"tf":2.0},"8":{"tf":2.0}},"e":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"0":{"df":1,"docs":{"117":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"l":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"117":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"57":{"tf":1.0}}}}},"df":0,"docs":{}},"与":{"df":0,"docs":{},"n":{"df":1,"docs":{"24":{"tf":1.0}}}}},"b":{"'":{"b":{"df":1,"docs":{"33":{"tf":1.0}}},"df":0,"docs":{}},"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"y":{"!":{"(":{"$":{"(":{"$":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"91":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}},":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"91":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"t":{"df":3,"docs":{"46":{"tf":1.0},"79":{"tf":1.4142135623730951},"99":{"tf":1.4142135623730951}}}}},"a":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":10,"docs":{"104":{"tf":1.0},"106":{"tf":2.23606797749979},"107":{"tf":1.7320508075688772},"114":{"tf":1.0},"115":{"tf":1.0},"117":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.0},"48":{"tf":2.0},"60":{"tf":1.0}}},"s":{"df":0,"docs":{},"e":{"df":2,"docs":{"107":{"tf":1.0},"63":{"tf":1.0}}}},"z":{"(":{"2":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"104":{"tf":1.4142135623730951},"106":{"tf":2.0},"107":{"tf":1.7320508075688772},"31":{"tf":1.0},"60":{"tf":1.0}}}},"df":17,"docs":{"12":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"22":{"tf":2.6457513110645907},"23":{"tf":2.0},"24":{"tf":1.4142135623730951},"65":{"tf":1.0},"66":{"tf":1.4142135623730951},"67":{"tf":1.0},"69":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"70":{"tf":1.4142135623730951},"8":{"tf":1.0},"84":{"tf":2.0},"91":{"tf":2.6457513110645907},"98":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"22":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"5":{"tf":1.4142135623730951}}}}},"n":{"d":{"df":1,"docs":{"81":{"tf":1.0}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"60":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"d":{"df":1,"docs":{"57":{"tf":1.0}}},"df":3,"docs":{"25":{"tf":1.4142135623730951},"60":{"tf":1.0},"88":{"tf":1.0}},"o":{"df":0,"docs":{},"p":{"df":3,"docs":{"6":{"tf":1.0},"7":{"tf":2.0},"9":{"tf":1.7320508075688772}}}}},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"83":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"t":{"df":2,"docs":{"126":{"tf":1.0},"99":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{":":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":5,"docs":{"16":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":2.449489742783178},"31":{"tf":1.0},"44":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"e":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}}},"o":{"d":{"df":0,"docs":{},"i":{"df":5,"docs":{"104":{"tf":1.0},"57":{"tf":1.4142135623730951},"58":{"tf":1.0},"88":{"tf":3.0},"9":{"tf":1.0}}},"y":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":2,"docs":{"57":{"tf":1.4142135623730951},"58":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"88":{"tf":3.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":3,"docs":{"0":{"tf":1.7320508075688772},"12":{"tf":1.0},"19":{"tf":1.0}}},"l":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"40":{"tf":1.0},"90":{"tf":1.0}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"22":{"tf":1.0}}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"14":{"tf":1.0}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"41":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":2,"docs":{"23":{"tf":1.4142135623730951},"29":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"8":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":4,"docs":{"22":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0},"8":{"tf":1.0}}}}},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"91":{"tf":1.0}}}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"e":{"df":1,"docs":{"70":{"tf":1.4142135623730951}}}}},"c":{"!":{"(":{"$":{"df":0,"docs":{},"i":{"df":1,"docs":{"57":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"/":{"c":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"$":{"df":0,"docs":{},"i":{":":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"a":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"b":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"!":{"(":{"$":{"a":{"b":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"91":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"55":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"57":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"57":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"l":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"!":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"83":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"83":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"!":{"(":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"(":{"\"":{"df":0,"docs":{},"y":{"df":1,"docs":{"83":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"83":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},":":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"83":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":1,"docs":{"83":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"122":{"tf":1.0},"41":{"tf":1.4142135623730951},"58":{"tf":1.4142135623730951},"91":{"tf":2.23606797749979}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}},"s":{"!":{"(":{"(":{"c":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"df":1,"docs":{"46":{"tf":1.0}}},"5":{"df":1,"docs":{"46":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":1,"docs":{"46":{"tf":1.0}},"s":{"!":{"(":{"#":{"[":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"46":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"91":{"tf":1.4142135623730951}}},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"109":{"tf":1.0}}}}}}},"df":6,"docs":{"109":{"tf":1.0},"11":{"tf":1.4142135623730951},"38":{"tf":1.0},"60":{"tf":1.0},"88":{"tf":1.0},"99":{"tf":1.7320508075688772}}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"107":{"tf":1.0}}},"t":{"df":1,"docs":{"98":{"tf":1.0}}}}},"c":{"df":1,"docs":{"2":{"tf":1.0}}},"df":10,"docs":{"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"5":{"tf":1.4142135623730951},"65":{"tf":1.0},"66":{"tf":1.4142135623730951},"67":{"tf":1.0},"69":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"84":{"tf":1.7320508075688772},"98":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":3.872983346207417},"24":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"22":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"101":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"22":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"83":{"tf":1.4142135623730951}}}}}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":3,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.4142135623730951},"88":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"r":{"df":1,"docs":{"1":{"tf":1.0}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":2,"docs":{"123":{"tf":1.4142135623730951},"22":{"tf":1.0}}}},"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"8":{"tf":2.0}}}}},"m":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"(":{"df":1,"docs":{"91":{"tf":1.0}}},"df":1,"docs":{"91":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}},"n":{"c":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"\"":{"$":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}}}}},"a":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"46":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"57":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}}},"df":6,"docs":{"23":{"tf":4.47213595499958},"24":{"tf":1.4142135623730951},"25":{"tf":1.0},"8":{"tf":2.0},"97":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"48":{"tf":1.0}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"y":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"22":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{":":{":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"v":{"1":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"v":{"1":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"0":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":1,"docs":{"11":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"$":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":1,"docs":{"49":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"49":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"18":{"tf":1.4142135623730951},"47":{"tf":1.0},"49":{"tf":2.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},",":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{")":{"*":{")":{"df":0,"docs":{},"并":{"df":0,"docs":{},"替":{"df":0,"docs":{},"换":{"df":0,"docs":{},"为":{"(":{"$":{"(":{"$":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"101":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"x":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"101":{"tf":3.605551275463989},"102":{"tf":2.449489742783178}}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":3,"docs":{"23":{"tf":3.872983346207417},"24":{"tf":1.4142135623730951},"25":{"tf":1.7320508075688772}},"s":{"!":{"(":{"$":{"(":{"$":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"23":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"1":{"df":1,"docs":{"23":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{},"x":{"df":1,"docs":{"23":{"tf":3.3166247903554}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"i":{"d":{"df":1,"docs":{"98":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"!":{"(":{"a":{"df":1,"docs":{"98":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"t":{"df":6,"docs":{"101":{"tf":1.7320508075688772},"79":{"tf":1.4142135623730951},"95":{"tf":1.0},"96":{"tf":2.449489742783178},"97":{"tf":1.0},"99":{"tf":3.4641016151377544}},"s":{"!":{"(":{"$":{"(":{"$":{"a":{"df":2,"docs":{"79":{"tf":2.0},"99":{"tf":2.0}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"96":{"tf":3.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"df":2,"docs":{"97":{"tf":1.0},"99":{"tf":2.449489742783178}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"101":{"tf":1.4142135623730951}}}}},"_":{"df":1,"docs":{"79":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":4,"docs":{"101":{"tf":3.1622776601683795},"102":{"tf":2.449489742783178},"49":{"tf":1.0},"98":{"tf":1.7320508075688772}}}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"55":{"tf":1.0}}}}}},"i":{"df":1,"docs":{"76":{"tf":1.0}},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"55":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"=":{"\"":{"b":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"8":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":21,"docs":{"109":{"tf":2.449489742783178},"11":{"tf":1.0},"113":{"tf":1.0},"118":{"tf":2.6457513110645907},"120":{"tf":1.0},"16":{"tf":1.7320508075688772},"23":{"tf":1.0},"25":{"tf":2.23606797749979},"31":{"tf":1.0},"38":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":3.0},"69":{"tf":3.1622776601683795},"71":{"tf":1.0},"72":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":4.0},"77":{"tf":2.23606797749979},"86":{"tf":1.0},"9":{"tf":1.0},"99":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{}}}},"z":{"df":0,"docs":{},"i":{"df":1,"docs":{"84":{"tf":1.0}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"22":{"tf":1.0}}}}},"d":{"[":{"0":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":3,"docs":{"17":{"tf":1.4142135623730951},"22":{"tf":1.0},"7":{"tf":1.4142135623730951}},"e":{"a":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"43":{"tf":1.0}},"e":{"!":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"43":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"99":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":1,"docs":{"84":{"tf":1.0}}},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"38":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"5":{"tf":1.7320508075688772},"55":{"tf":1.0},"65":{"tf":1.7320508075688772},"66":{"tf":1.7320508075688772},"67":{"tf":1.4142135623730951},"69":{"tf":2.6457513110645907}},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"122":{"tf":1.0},"31":{"tf":2.6457513110645907},"81":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":6,"docs":{"18":{"tf":2.0},"47":{"tf":1.0},"48":{"tf":1.0},"49":{"tf":1.7320508075688772},"50":{"tf":1.0},"51":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":7,"docs":{"104":{"tf":1.4142135623730951},"110":{"tf":1.0},"113":{"tf":1.0},"116":{"tf":3.4641016151377544},"117":{"tf":2.23606797749979},"121":{"tf":1.4142135623730951},"8":{"tf":1.0}},"e":{"(":{"$":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"110":{"tf":1.0}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"106":{"tf":1.0},"107":{"tf":1.0},"8":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"116":{"tf":1.0},"117":{"tf":1.4142135623730951}},"v":{"df":1,"docs":{"116":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"121":{"tf":1.4142135623730951}}}}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"91":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"i":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"62":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":1,"docs":{"84":{"tf":1.4142135623730951}},"s":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"c":{"df":1,"docs":{"34":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"91":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"48":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"83":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"(":{"$":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"_":{"df":1,"docs":{"58":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"57":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"57":{"tf":1.7320508075688772}}}}}}},"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"57":{"tf":2.0},"58":{"tf":2.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"n":{"df":2,"docs":{"39":{"tf":1.0},"88":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":4,"docs":{"57":{"tf":3.0},"58":{"tf":1.4142135623730951},"8":{"tf":1.0},"93":{"tf":1.0}}},"y":{"(":{"4":{")":{".":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"(":{")":{".":{"0":{"df":2,"docs":{"57":{"tf":2.0},"58":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"3":{"2":{"df":2,"docs":{"57":{"tf":2.0},"58":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"+":{"1":{"df":1,"docs":{"88":{"tf":1.0}}},"2":{"df":1,"docs":{"88":{"tf":1.0}}},"3":{"df":1,"docs":{"88":{"tf":1.0}}},"df":0,"docs":{}},".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"88":{"tf":6.557438524302}}}}}},"df":0,"docs":{}},"0":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"23":{"tf":2.0}}}}}}},"df":0,"docs":{}},"1":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"23":{"tf":2.0}}}}}}},"df":0,"docs":{}},"2":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"23":{"tf":1.0}}}}}}},"df":1,"docs":{"23":{"tf":1.0}}},":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":10,"docs":{"11":{"tf":1.0},"16":{"tf":2.23606797749979},"23":{"tf":2.0},"24":{"tf":1.7320508075688772},"43":{"tf":1.0},"46":{"tf":1.0},"54":{"tf":1.4142135623730951},"86":{"tf":2.0},"88":{"tf":3.7416573867739413},"93":{"tf":1.0}}}}}}},"a":{"c":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"!":{"(":{"$":{"(":{"$":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"60":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"60":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"60":{"tf":1.4142135623730951}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"60":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"60":{"tf":3.1622776601683795}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"d":{"d":{"df":0,"docs":{},"y":{"b":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"35":{"tf":1.0},"36":{"tf":1.0},"44":{"tf":1.0}}}}},"df":13,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"16":{"tf":2.449489742783178},"17":{"tf":1.4142135623730951},"21":{"tf":2.8284271247461903},"22":{"tf":2.8284271247461903},"23":{"tf":2.6457513110645907},"24":{"tf":2.6457513110645907},"54":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772},"86":{"tf":1.7320508075688772},"88":{"tf":5.830951894845301},"93":{"tf":1.0}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":2.0}},"i":{"df":1,"docs":{"91":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.0}}}}}}},"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.0},"38":{"tf":1.0}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"41":{"tf":1.0},"88":{"tf":1.0}}}}}},"n":{"d":{"df":1,"docs":{"5":{"tf":1.4142135623730951}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"107":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"107":{"tf":2.0}},"e":{"df":0,"docs":{},"r":{"!":{"(":{"@":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"107":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":4,"docs":{"107":{"tf":2.6457513110645907},"117":{"tf":1.0},"31":{"tf":1.0},"98":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}},"、":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"116":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"101":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"[":{"df":0,"docs":{},"e":{"0":{"4":{"2":{"4":{"df":1,"docs":{"57":{"tf":1.0}}},"5":{"df":2,"docs":{"23":{"tf":2.0},"54":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":8,"docs":{"17":{"tf":1.0},"22":{"tf":1.0},"41":{"tf":1.4142135623730951},"45":{"tf":1.0},"48":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0},"68":{"tf":1.7320508075688772}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":2,"docs":{"79":{"tf":1.4142135623730951},"99":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"x":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"51":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":3,"docs":{"12":{"tf":1.0},"18":{"tf":1.0},"78":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"91":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"83":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":9,"docs":{"11":{"tf":1.0},"120":{"tf":1.0},"23":{"tf":1.4142135623730951},"24":{"tf":1.0},"38":{"tf":1.0},"47":{"tf":1.0},"60":{"tf":2.23606797749979},"88":{"tf":2.449489742783178},"99":{"tf":2.6457513110645907}}},"df":0,"docs":{},"s":{"df":6,"docs":{"14":{"tf":2.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"18":{"tf":1.0},"47":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"57":{"tf":1.0},"58":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"63":{"tf":1.0}}}}},"r":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"29":{"tf":1.0}}}}}}},"df":7,"docs":{"11":{"tf":1.0},"120":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"27":{"tf":1.0},"29":{"tf":1.4142135623730951},"44":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":9,"docs":{"16":{"tf":1.0},"18":{"tf":1.0},"21":{"tf":1.0},"29":{"tf":1.7320508075688772},"33":{"tf":1.0},"40":{"tf":1.0},"48":{"tf":1.0},"52":{"tf":1.0},"8":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"3":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"df":9,"docs":{"11":{"tf":1.0},"23":{"tf":1.0},"31":{"tf":1.4142135623730951},"38":{"tf":1.0},"69":{"tf":1.7320508075688772},"75":{"tf":1.0},"76":{"tf":2.23606797749979},"77":{"tf":1.0},"99":{"tf":1.0}}}}}}}},"f":{"3":{"2":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{")":{".":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"(":{"1":{"0":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"[":{"df":0,"docs":{},"i":{"df":1,"docs":{"24":{"tf":1.0}}}},"_":{"df":0,"docs":{},"u":{"1":{"2":{"8":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"85":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"85":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"85":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"4":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"85":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"85":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"{":{"0":{"df":1,"docs":{"20":{"tf":1.0}}},"1":{"df":1,"docs":{"20":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"20":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":1,"docs":{"20":{"tf":1.7320508075688772}}}}},"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"52":{"tf":1.0},"81":{"tf":1.0}}}},"l":{"df":0,"docs":{},"s":{"df":2,"docs":{"101":{"tf":1.0},"84":{"tf":1.0}}}}},"df":2,"docs":{"17":{"tf":1.4142135623730951},"85":{"tf":2.8284271247461903}},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":5,"docs":{"121":{"tf":2.23606797749979},"18":{"tf":1.0},"23":{"tf":1.0},"47":{"tf":1.0},"78":{"tf":1.0}},"e":{"(":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":3,"docs":{"78":{"tf":1.0},"79":{"tf":1.0},"81":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"61":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":7,"docs":{"18":{"tf":1.0},"47":{"tf":1.0},"48":{"tf":1.0},"49":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"d":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":3,"docs":{"11":{"tf":1.0},"38":{"tf":1.0},"99":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"60":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"5":{"tf":1.0}}}}}},"i":{"b":{"(":{"1":{"0":{"0":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":1,"docs":{"8":{"tf":1.7320508075688772}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"(":{"1":{"0":{"df":4,"docs":{"21":{"tf":2.0},"22":{"tf":2.0},"23":{"tf":1.7320508075688772},"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"_":{"1":{"0":{"0":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"21":{"tf":2.0},"22":{"tf":2.23606797749979},"23":{"tf":2.8284271247461903},"24":{"tf":1.0}},"o":{"df":0,"docs":{},"n":{"a":{"c":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"20":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":1,"docs":{"106":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"106":{"tf":1.0}},"e":{":":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"106":{"tf":1.0},"107":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"106":{"tf":1.4142135623730951}}},"y":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"i":{"df":1,"docs":{"106":{"tf":1.4142135623730951}},"s":{":":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":3,"docs":{"106":{"tf":2.0},"107":{"tf":2.0},"117":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"101":{"tf":1.0}}}},"d":{"df":2,"docs":{"23":{"tf":2.0},"54":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":1,"docs":{"41":{"tf":1.0}}}},"r":{"df":1,"docs":{"83":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"41":{"tf":1.0},"88":{"tf":2.0}}}}}},"n":{"df":73,"docs":{"10":{"tf":1.7320508075688772},"101":{"tf":1.0},"102":{"tf":1.0},"104":{"tf":2.0},"106":{"tf":1.0},"107":{"tf":1.0},"11":{"tf":1.4142135623730951},"111":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.4142135623730951},"115":{"tf":1.7320508075688772},"116":{"tf":1.0},"117":{"tf":1.0},"120":{"tf":1.0},"15":{"tf":2.0},"17":{"tf":1.7320508075688772},"21":{"tf":2.0},"22":{"tf":2.8284271247461903},"23":{"tf":4.47213595499958},"24":{"tf":2.6457513110645907},"28":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"38":{"tf":2.0},"40":{"tf":1.0},"41":{"tf":2.0},"43":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951},"49":{"tf":1.0},"5":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"55":{"tf":1.4142135623730951},"57":{"tf":3.1622776601683795},"58":{"tf":1.4142135623730951},"60":{"tf":1.0},"61":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.4142135623730951},"67":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.7320508075688772},"70":{"tf":1.7320508075688772},"75":{"tf":1.0},"76":{"tf":1.4142135623730951},"77":{"tf":1.0},"79":{"tf":1.0},"8":{"tf":1.7320508075688772},"81":{"tf":1.4142135623730951},"83":{"tf":1.4142135623730951},"84":{"tf":1.0},"85":{"tf":3.1622776601683795},"86":{"tf":1.7320508075688772},"88":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.7320508075688772},"93":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.7320508075688772},"97":{"tf":1.0},"98":{"tf":1.0},"99":{"tf":1.7320508075688772}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"u":{"3":{"2":{"df":1,"docs":{"37":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"22":{"tf":1.0},"44":{"tf":1.0},"57":{"tf":1.4142135623730951}}}}}},"o":{"!":{"(":{"@":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"86":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"114":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"81":{"tf":1.0}}}}}},"df":0,"docs":{}},"(":{"_":{"df":1,"docs":{"10":{"tf":1.0}}},"b":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"104":{"tf":1.0},"34":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},":":{":":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"40":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"81":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":18,"docs":{"10":{"tf":2.8284271247461903},"106":{"tf":1.7320508075688772},"107":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.4142135623730951},"38":{"tf":2.23606797749979},"41":{"tf":1.4142135623730951},"48":{"tf":2.449489742783178},"49":{"tf":1.4142135623730951},"5":{"tf":1.0},"55":{"tf":1.0},"81":{"tf":1.7320508075688772},"86":{"tf":2.449489742783178}},"、":{"'":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":0,"docs":{}}}},":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"d":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"、":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"<":{"_":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"8":{"tf":1.0}}}}},"df":0,"docs":{}},"df":2,"docs":{"104":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"23":{"tf":2.0},"54":{"tf":1.0},"57":{"tf":1.0}}},"df":0,"docs":{}},"r":{"!":{"(":{")":{"df":0,"docs":{},"、":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"15":{"tf":1.7320508075688772},"24":{"tf":2.23606797749979},"54":{"tf":2.23606797749979},"9":{"tf":2.449489742783178}}}}},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"126":{"tf":1.0},"16":{"tf":1.0},"27":{"tf":1.0}}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"$":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"121":{"tf":1.0}},"i":{"df":1,"docs":{"10":{"tf":1.0}}}}},"n":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"29":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"104":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":3,"docs":{"31":{"tf":1.0},"57":{"tf":1.0},"8":{"tf":1.0}}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"29":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"g":{":":{":":{"<":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{">":{":":{":":{"c":{"df":1,"docs":{"37":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"b":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"!":{"(":{"4":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"84":{"tf":1.0}}}}}},"t":{"df":2,"docs":{"24":{"tf":1.4142135623730951},"54":{"tf":1.4142135623730951}}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"115":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"d":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":2,"docs":{"23":{"tf":2.23606797749979},"24":{"tf":2.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":4,"docs":{"11":{"tf":1.0},"16":{"tf":1.0},"33":{"tf":1.0},"50":{"tf":1.0}}}},"p":{"df":3,"docs":{"38":{"tf":1.4142135623730951},"55":{"tf":1.7320508075688772},"57":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"1":{"df":1,"docs":{"117":{"tf":1.0}}},"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"55":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"55":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"117":{"tf":1.0},"55":{"tf":2.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"22":{"tf":1.0},"5":{"tf":1.0}}}}},"i":{"df":2,"docs":{"70":{"tf":2.0},"88":{"tf":2.0}},"t":{"df":1,"docs":{"41":{"tf":1.0}}}},"o":{"df":1,"docs":{"84":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"34":{"tf":1.0}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"!":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"5":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":1,"docs":{"83":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"123":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":4,"docs":{"10":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.7320508075688772},"81":{"tf":1.7320508075688772}}}}}}}},"i":{"2":{":":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"17":{"tf":1.4142135623730951},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"17":{"tf":2.0},"45":{"tf":1.0}}},"3":{"2":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"104":{"tf":1.4142135623730951},"106":{"tf":1.4142135623730951}}},"df":0,"docs":{}},":":{"df":0,"docs":{},"i":{"d":{"df":5,"docs":{"17":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"57":{"tf":2.23606797749979}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"93":{"tf":1.0}}}}}}},"c":{"df":0,"docs":{},"y":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"30":{"tf":1.0},"41":{"tf":2.0}}},"df":0,"docs":{}}},"df":17,"docs":{"104":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":2.0},"27":{"tf":1.0},"30":{"tf":2.0},"32":{"tf":1.0},"41":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"46":{"tf":1.0},"49":{"tf":1.7320508075688772},"52":{"tf":1.0},"56":{"tf":1.7320508075688772},"81":{"tf":1.0},"83":{"tf":1.0},"98":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":8,"docs":{"16":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0},"46":{"tf":1.4142135623730951},"5":{"tf":1.0},"57":{"tf":1.4142135623730951},"63":{"tf":1.0},"8":{"tf":1.0}}}}},"s":{":":{":":{"_":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"98":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"98":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"、":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"27":{"tf":1.0}}}}}}}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"、":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"44":{"tf":1.0}}}}}},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"$":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"18":{"tf":1.0},"47":{"tf":1.0},"52":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"<":{"'":{"a":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"120":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"23":{"tf":2.23606797749979},"24":{"tf":1.4142135623730951},"31":{"tf":1.0},"40":{"tf":1.0},"57":{"tf":2.0},"58":{"tf":1.0},"8":{"tf":1.0},"81":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"63":{"tf":1.0}}}}}}},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"84":{"tf":1.4142135623730951}}}}}}}}},"d":{":":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"24":{"tf":2.0},"7":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"(":{"0":{"df":2,"docs":{"18":{"tf":1.0},"50":{"tf":1.4142135623730951}}},"1":{"df":3,"docs":{"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"18":{"tf":1.0},"47":{"tf":1.0},"50":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"22":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"<":{"'":{"b":{">":{"(":{"&":{"'":{"b":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}},"df":8,"docs":{"18":{"tf":1.0},"22":{"tf":3.0},"23":{"tf":3.4641016151377544},"24":{"tf":2.449489742783178},"50":{"tf":1.4142135623730951},"51":{"tf":1.0},"52":{"tf":1.0},"7":{"tf":1.0}},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"<":{"'":{"a":{"df":3,"docs":{"22":{"tf":2.449489742783178},"23":{"tf":2.8284271247461903},"24":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"22":{"tf":2.0},"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951}},"{":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}},"i":{"c":{"df":1,"docs":{"50":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"117":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":2,"docs":{"84":{"tf":1.0},"88":{"tf":1.0}}}}}}},"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"!":{"(":{"@":{"a":{"c":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"88":{"tf":3.7416573867739413}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"[":{"0":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"88":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"88":{"tf":4.47213595499958}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":7,"docs":{"21":{"tf":2.0},"22":{"tf":1.4142135623730951},"23":{"tf":2.449489742783178},"24":{"tf":1.4142135623730951},"84":{"tf":1.0},"88":{"tf":1.0},"9":{"tf":1.4142135623730951}},"i":{"df":2,"docs":{"11":{"tf":1.4142135623730951},"9":{"tf":1.0}}},"s":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":5,"docs":{"21":{"tf":4.123105625617661},"22":{"tf":2.0},"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"104":{"tf":1.0},"21":{"tf":1.7320508075688772},"22":{"tf":1.4142135623730951},"23":{"tf":2.0},"24":{"tf":1.4142135623730951},"46":{"tf":2.0}},"e":{"(":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"y":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{"df":0,"docs":{},"i":{"d":{"df":4,"docs":{"49":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0}}},"df":0,"docs":{}}},"df":3,"docs":{"49":{"tf":2.449489742783178},"51":{"tf":1.0},"55":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":7,"docs":{"107":{"tf":1.4142135623730951},"110":{"tf":1.0},"112":{"tf":1.0},"114":{"tf":1.4142135623730951},"21":{"tf":1.4142135623730951},"88":{"tf":1.0},"91":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"27":{"tf":1.0},"39":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"df":1,"docs":{"16":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"86":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"40":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"v":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"57":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":4,"docs":{"0":{"tf":1.4142135623730951},"18":{"tf":1.0},"47":{"tf":1.0},"78":{"tf":1.0}}}}},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"41":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"31":{"tf":1.0}}}}}}},"df":14,"docs":{"103":{"tf":1.7320508075688772},"14":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"23":{"tf":2.23606797749979},"24":{"tf":1.4142135623730951},"27":{"tf":1.0},"31":{"tf":3.0},"38":{"tf":1.7320508075688772},"55":{"tf":1.4142135623730951},"77":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.0}},"、":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"21":{"tf":1.0}}}}}}}},"r":{"df":6,"docs":{"20":{"tf":1.4142135623730951},"21":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"23":{"tf":2.8284271247461903},"24":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951}}}}}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"91":{"tf":1.0}}}}}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}},"y":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":4,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"5":{"tf":1.0},"57":{"tf":2.23606797749979}}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"83":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"83":{"tf":1.7320508075688772}}}}}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"32":{"tf":1.0},"54":{"tf":1.0}}}}},"c":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"5":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"83":{"tf":2.449489742783178}}}},"df":0,"docs":{}},"z":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"8":{"tf":1.0}}},"k":{"df":1,"docs":{"66":{"tf":1.0}}}},"df":0,"docs":{},"n":{"(":{"&":{"[":{"$":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"c":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"!":{"(":{"$":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"97":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":1,"docs":{"51":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"51":{"tf":1.0},"97":{"tf":1.0}},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"(":{"0":{"df":2,"docs":{"18":{"tf":1.0},"51":{"tf":1.0}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"18":{"tf":1.0},"47":{"tf":1.0},"51":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"df":3,"docs":{"18":{"tf":1.0},"51":{"tf":1.0},"97":{"tf":1.0}}}}}},"t":{"'":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{},"s":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"51":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":1.0}}}}},"x":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.4142135623730951}}}}}},"h":{"df":3,"docs":{"6":{"tf":1.0},"7":{"tf":2.0},"9":{"tf":1.7320508075688772}}},"i":{"b":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"109":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":4,"docs":{"109":{"tf":1.0},"25":{"tf":1.7320508075688772},"62":{"tf":1.4142135623730951},"76":{"tf":1.4142135623730951}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"2":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":5,"docs":{"16":{"tf":1.0},"27":{"tf":1.0},"32":{"tf":2.449489742783178},"41":{"tf":1.0},"46":{"tf":1.0}},"e":{":":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"32":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"104":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{":":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":9,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"22":{"tf":1.0},"27":{"tf":1.0},"29":{"tf":1.0},"33":{"tf":2.23606797749979},"35":{"tf":1.0},"36":{"tf":1.0},"5":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"9":{"tf":2.0}}}}},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"o":{"c":{"a":{"df":0,"docs":{},"l":{"df":6,"docs":{"10":{"tf":3.605551275463989},"120":{"tf":2.0},"22":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0},"54":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"x":{"!":{"(":{"$":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"61":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"61":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"84":{"tf":1.0}}}}}}}}}}},"u":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"62":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"m":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"46":{"tf":1.0}}},"df":0,"docs":{}}}}},"a":{"c":{"df":3,"docs":{"25":{"tf":1.4142135623730951},"69":{"tf":1.4142135623730951},"76":{"tf":2.6457513110645907}},"r":{"df":0,"docs":{},"o":{"2":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"119":{"tf":2.0},"120":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"119":{"tf":2.449489742783178},"121":{"tf":1.0}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":6,"docs":{"25":{"tf":1.7320508075688772},"55":{"tf":1.7320508075688772},"72":{"tf":1.0},"76":{"tf":2.0},"80":{"tf":1.0},"86":{"tf":2.0}}}}}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"62":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":76,"docs":{"10":{"tf":2.0},"101":{"tf":2.0},"102":{"tf":1.0},"104":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":1.0},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"14":{"tf":2.449489742783178},"15":{"tf":1.7320508075688772},"16":{"tf":2.23606797749979},"17":{"tf":1.7320508075688772},"21":{"tf":1.7320508075688772},"22":{"tf":2.449489742783178},"23":{"tf":3.605551275463989},"24":{"tf":2.6457513110645907},"25":{"tf":1.7320508075688772},"26":{"tf":1.0},"28":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"38":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":2.23606797749979},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":2.0},"48":{"tf":2.0},"49":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"54":{"tf":1.4142135623730951},"55":{"tf":1.7320508075688772},"57":{"tf":2.449489742783178},"58":{"tf":1.4142135623730951},"60":{"tf":1.0},"61":{"tf":1.0},"62":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.4142135623730951},"67":{"tf":1.4142135623730951},"68":{"tf":2.0},"69":{"tf":2.0},"70":{"tf":2.0},"72":{"tf":1.0},"73":{"tf":1.0},"75":{"tf":1.4142135623730951},"76":{"tf":1.7320508075688772},"77":{"tf":1.4142135623730951},"78":{"tf":1.0},"79":{"tf":2.0},"8":{"tf":2.449489742783178},"80":{"tf":1.0},"81":{"tf":2.0},"83":{"tf":2.0},"84":{"tf":1.7320508075688772},"85":{"tf":1.4142135623730951},"86":{"tf":2.23606797749979},"88":{"tf":1.7320508075688772},"90":{"tf":1.7320508075688772},"91":{"tf":1.0},"93":{"tf":2.23606797749979},"95":{"tf":1.4142135623730951},"96":{"tf":2.23606797749979},"97":{"tf":1.4142135623730951},"98":{"tf":1.0},"99":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"s":{"df":10,"docs":{"11":{"tf":1.0},"23":{"tf":1.0},"38":{"tf":1.0},"69":{"tf":2.449489742783178},"70":{"tf":1.0},"71":{"tf":1.0},"75":{"tf":1.7320508075688772},"76":{"tf":2.0},"77":{"tf":1.4142135623730951},"99":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"76":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":29,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"104":{"tf":1.0},"106":{"tf":1.0},"109":{"tf":2.449489742783178},"117":{"tf":1.0},"119":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"121":{"tf":1.0},"125":{"tf":1.0},"18":{"tf":1.0},"22":{"tf":1.0},"3":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"5":{"tf":1.4142135623730951},"57":{"tf":1.7320508075688772},"58":{"tf":1.4142135623730951},"60":{"tf":1.4142135623730951},"75":{"tf":1.0},"76":{"tf":1.4142135623730951},"78":{"tf":1.0},"79":{"tf":2.6457513110645907},"8":{"tf":1.7320508075688772},"80":{"tf":2.0},"81":{"tf":2.23606797749979},"88":{"tf":1.0},"9":{"tf":1.0},"99":{"tf":1.0}}}},"s":{":":{":":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"76":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"22":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":63,"docs":{"10":{"tf":1.4142135623730951},"101":{"tf":1.0},"102":{"tf":1.0},"104":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":1.0},"11":{"tf":1.4142135623730951},"17":{"tf":1.7320508075688772},"21":{"tf":1.4142135623730951},"22":{"tf":1.7320508075688772},"23":{"tf":3.3166247903554},"24":{"tf":1.7320508075688772},"25":{"tf":1.0},"28":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"38":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":2.0},"43":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951},"49":{"tf":1.0},"5":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"57":{"tf":2.23606797749979},"58":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.4142135623730951},"67":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.7320508075688772},"70":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":1.4142135623730951},"77":{"tf":1.0},"79":{"tf":1.0},"8":{"tf":1.4142135623730951},"81":{"tf":1.0},"83":{"tf":1.4142135623730951},"84":{"tf":1.0},"86":{"tf":1.7320508075688772},"88":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"93":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.7320508075688772},"97":{"tf":1.0},"98":{"tf":1.0},"99":{"tf":1.7320508075688772}}}},"k":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"10":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"!":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"57":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"57":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"!":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"57":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"57":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"91":{"tf":1.0}}},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"114":{"tf":1.0}}}}},"n":{"a":{"df":1,"docs":{"114":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":1,"docs":{"51":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}},"s":{"!":{"(":{"$":{"df":1,"docs":{"46":{"tf":1.0}}},"(":{"c":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"df":1,"docs":{"46":{"tf":1.0}}},"5":{"df":1,"docs":{"46":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":8,"docs":{"11":{"tf":1.0},"23":{"tf":2.23606797749979},"41":{"tf":1.0},"48":{"tf":1.0},"5":{"tf":1.0},"68":{"tf":1.7320508075688772},"8":{"tf":1.4142135623730951},"86":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"103":{"tf":1.0},"14":{"tf":2.0},"15":{"tf":2.449489742783178},"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"79":{"tf":1.0}}}}}},"df":0,"docs":{}},"y":{"b":{"df":1,"docs":{"83":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"b":{"df":0,"docs":{},"e":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}},"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":4,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"123":{"tf":1.4142135623730951},"38":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":3,"docs":{"101":{"tf":1.4142135623730951},"12":{"tf":1.0},"14":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":3,"docs":{"23":{"tf":3.4641016151377544},"24":{"tf":2.8284271247461903},"25":{"tf":1.0}}}}}},"df":4,"docs":{"21":{"tf":2.23606797749979},"22":{"tf":2.23606797749979},"23":{"tf":3.0},"24":{"tf":2.0}}},"t":{"a":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"df":4,"docs":{"104":{"tf":1.0},"106":{"tf":1.7320508075688772},"107":{"tf":1.0},"34":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}},"df":6,"docs":{"104":{"tf":1.0},"106":{"tf":1.7320508075688772},"16":{"tf":1.0},"17":{"tf":1.0},"27":{"tf":1.0},"34":{"tf":2.0}},"v":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"126":{"tf":1.0},"16":{"tf":1.4142135623730951},"18":{"tf":1.0},"27":{"tf":1.0},"52":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"105":{"tf":1.0},"57":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"83":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"41":{"tf":1.0}}}},"t":{"df":1,"docs":{"2":{"tf":1.0}}},"x":{"df":3,"docs":{"122":{"tf":1.0},"54":{"tf":1.0},"81":{"tf":1.0}},"e":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"84":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"!":{"(":{"$":{"(":{"$":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"84":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"d":{"df":9,"docs":{"55":{"tf":1.0},"65":{"tf":1.7320508075688772},"66":{"tf":2.449489742783178},"67":{"tf":1.7320508075688772},"68":{"tf":1.0},"69":{"tf":3.0},"71":{"tf":1.7320508075688772},"75":{"tf":1.0},"76":{"tf":1.0}},"u":{"df":0,"docs":{},"l":{"df":2,"docs":{"31":{"tf":1.0},"57":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"70":{"tf":1.4142135623730951}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":2,"docs":{"101":{"tf":2.23606797749979},"102":{"tf":2.0}}}}},"df":0,"docs":{}}}}},"u":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"91":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":1,"docs":{"9":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":3,"docs":{"22":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0}},"y":{"_":{"a":{"d":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"n":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"39":{"tf":1.0},"84":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"0":{"df":1,"docs":{"57":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":1,"docs":{"57":{"tf":1.4142135623730951}}}}}}},"df":8,"docs":{"10":{"tf":1.0},"17":{"tf":1.0},"22":{"tf":2.449489742783178},"23":{"tf":3.1622776601683795},"24":{"tf":2.0},"35":{"tf":1.0},"36":{"tf":1.0},"57":{"tf":2.6457513110645907}}}},"y":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"113":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"88":{"tf":1.7320508075688772}}}}},"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"112":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"111":{"tf":1.0}}}}}}}},":":{"df":0,"docs":{},"i":{"d":{"df":4,"docs":{"104":{"tf":1.0},"106":{"tf":1.7320508075688772},"107":{"tf":1.0},"84":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":12,"docs":{"104":{"tf":1.0},"106":{"tf":2.0},"107":{"tf":1.0},"120":{"tf":1.7320508075688772},"14":{"tf":1.0},"16":{"tf":1.0},"57":{"tf":1.0},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"81":{"tf":2.23606797749979},"84":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}},"!":{"$":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"110":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"df":8,"docs":{"101":{"tf":2.449489742783178},"102":{"tf":1.0},"11":{"tf":1.0},"21":{"tf":2.449489742783178},"22":{"tf":2.6457513110645907},"23":{"tf":3.3166247903554},"88":{"tf":1.7320508075688772},"97":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"w":{"df":2,"docs":{"22":{"tf":1.0},"81":{"tf":1.0}}},"x":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"21":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"21":{"tf":2.23606797749979},"22":{"tf":2.6457513110645907},"23":{"tf":3.4641016151377544},"24":{"tf":2.449489742783178}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"106":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":7,"docs":{"11":{"tf":1.0},"23":{"tf":1.4142135623730951},"38":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"88":{"tf":1.0},"99":{"tf":1.0}}}}}}}},"o":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":2,"docs":{"46":{"tf":2.0},"8":{"tf":1.0}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"d":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"98":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":1,"docs":{"41":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":2,"docs":{"22":{"tf":1.0},"8":{"tf":1.0}},"e":{"df":2,"docs":{"51":{"tf":1.0},"91":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":5,"docs":{"38":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":3.3166247903554},"88":{"tf":3.605551275463989},"99":{"tf":3.3166247903554}}},"h":{"df":1,"docs":{"14":{"tf":1.0}}}},"w":{"df":1,"docs":{"91":{"tf":1.0}}}},"t":{"df":3,"docs":{"22":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"98":{"tf":1.0}}}}}},"{":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"{":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"o":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"n":{"df":1,"docs":{"99":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"df":1,"docs":{"99":{"tf":1.0}}}},"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"df":0,"docs":{},"o":{"df":1,"docs":{"30":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"d":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":2,"docs":{"79":{"tf":1.4142135623730951},"99":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":3,"docs":{"22":{"tf":3.4641016151377544},"23":{"tf":4.0},"24":{"tf":2.8284271247461903}}}}}}},"g":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}},"h":{"df":1,"docs":{"84":{"tf":1.7320508075688772}}},"n":{"df":3,"docs":{"51":{"tf":1.0},"52":{"tf":1.7320508075688772},"70":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"27":{"tf":1.0}}}}},"df":4,"docs":{"18":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":2.0},"9":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"99":{"tf":1.0}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"41":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"<":{"$":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"23":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"21":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"6":{"4":{"df":3,"docs":{"21":{"tf":1.0},"22":{"tf":1.4142135623730951},"23":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":1,"docs":{"91":{"tf":1.4142135623730951}}}}},"df":5,"docs":{"22":{"tf":1.4142135623730951},"23":{"tf":1.4142135623730951},"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":2,"docs":{"46":{"tf":1.0},"83":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"49":{"tf":1.0},"51":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"49":{"tf":2.449489742783178},"51":{"tf":1.0}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951},"88":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"91":{"tf":1.0}}}}}},"p":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"93":{"tf":1.0}}}},"df":0,"docs":{}}},"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"43":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"57":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}},"s":{"df":5,"docs":{"121":{"tf":1.7320508075688772},"22":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0},"6":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"121":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":1,"docs":{"8":{"tf":1.0}}}}},"t":{"df":1,"docs":{"91":{"tf":1.0}},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"54":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"22":{"tf":1.0}}}},"t":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":2,"docs":{"35":{"tf":1.0},"36":{"tf":1.0}}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"]":{"df":0,"docs":{},":":{"=":{">":{"df":0,"docs":{},"、":{",":{"df":0,"docs":{},"、":{"=":{"df":0,"docs":{},"、":{"df":0,"docs":{},"|":{"df":0,"docs":{},"、":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"、":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"44":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"27":{"tf":1.0},"36":{"tf":2.23606797749979}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":7,"docs":{"104":{"tf":1.4142135623730951},"16":{"tf":1.0},"27":{"tf":1.0},"35":{"tf":1.4142135623730951},"36":{"tf":2.0},"44":{"tf":1.0},"56":{"tf":1.0}},"h":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"37":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":8,"docs":{"16":{"tf":1.0},"27":{"tf":1.0},"34":{"tf":1.0},"37":{"tf":2.0},"44":{"tf":1.4142135623730951},"63":{"tf":1.4142135623730951},"80":{"tf":1.0},"91":{"tf":1.0}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":5,"docs":{"16":{"tf":1.0},"35":{"tf":2.0},"36":{"tf":2.6457513110645907},"57":{"tf":1.0},"8":{"tf":1.0}},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"35":{"tf":1.0},"36":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":1,"docs":{"93":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"83":{"tf":1.4142135623730951}}}}},"l":{"a":{"df":0,"docs":{},"y":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"11":{"tf":1.0},"38":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":1,"docs":{"60":{"tf":2.6457513110645907}}}}},"o":{"df":4,"docs":{"21":{"tf":2.23606797749979},"22":{"tf":2.0},"23":{"tf":3.0},"24":{"tf":2.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"107":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"21":{"tf":1.0},"22":{"tf":1.0}}}}}},"r":{"df":1,"docs":{"0":{"tf":1.0}},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"57":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":4,"docs":{"11":{"tf":1.0},"23":{"tf":1.0},"38":{"tf":1.0},"99":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":3,"docs":{"115":{"tf":1.0},"23":{"tf":1.4142135623730951},"24":{"tf":1.0}}},"y":{"=":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}},"f":{"(":{"\"":{"df":0,"docs":{},"o":{"df":0,"docs":{},"h":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"n":{"!":{"(":{"\"":{"#":{"1":{"df":1,"docs":{"83":{"tf":1.0}}},"2":{"df":1,"docs":{"83":{"tf":1.0}}},"3":{"df":1,"docs":{"83":{"tf":1.0}}},"4":{"df":1,"docs":{"83":{"tf":1.0}}},"5":{"df":1,"docs":{"83":{"tf":1.0}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":1,"docs":{"49":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"49":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":2,"docs":{"11":{"tf":1.0},"8":{"tf":1.0}}}}}},"i":{"df":1,"docs":{"8":{"tf":1.0}}}},"i":{"df":1,"docs":{"83":{"tf":1.0}}},"p":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"91":{"tf":1.0}}}}},"df":0,"docs":{}},"{":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"v":{"df":1,"docs":{"50":{"tf":1.0}}},"}":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"{":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}},"{":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"计":{"df":0,"docs":{},"数":{"df":0,"docs":{},"结":{"df":0,"docs":{},"果":{"df":0,"docs":{},":":{"df":0,"docs":{},"{":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"102":{"tf":2.23606797749979}}}},"df":0,"docs":{}}}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"y":{"!":{"(":{"$":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"84":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":14,"docs":{"102":{"tf":2.0},"21":{"tf":2.0},"22":{"tf":2.0},"23":{"tf":2.0},"24":{"tf":1.4142135623730951},"41":{"tf":1.0},"46":{"tf":1.0},"51":{"tf":1.0},"57":{"tf":2.449489742783178},"58":{"tf":1.0},"8":{"tf":1.0},"83":{"tf":1.4142135623730951},"88":{"tf":1.0},"97":{"tf":1.0}}}}}},"v":{"df":1,"docs":{"44":{"tf":1.0}}}},"o":{"c":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"2":{"df":1,"docs":{"120":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":5,"docs":{"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0},"119":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"_":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"112":{"tf":1.0},"115":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"116":{"tf":1.0},"117":{"tf":1.0}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"l":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"116":{"tf":1.0},"117":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":7,"docs":{"109":{"tf":1.4142135623730951},"111":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":2.6457513110645907},"121":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":7,"docs":{"10":{"tf":1.0},"104":{"tf":1.0},"109":{"tf":2.23606797749979},"119":{"tf":3.4641016151377544},"120":{"tf":1.0},"121":{"tf":1.4142135623730951},"8":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"8":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"107":{"tf":1.7320508075688772},"84":{"tf":1.0}}}}}},"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"88":{"tf":1.0}}}},"df":0,"docs":{}}}}},"u":{"b":{"(":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"106":{"tf":1.7320508075688772},"107":{"tf":1.7320508075688772},"41":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"41":{"tf":1.4142135623730951}}}}},"_":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"41":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":12,"docs":{"104":{"tf":1.0},"106":{"tf":1.4142135623730951},"111":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0},"41":{"tf":2.449489742783178},"55":{"tf":1.4142135623730951},"81":{"tf":1.4142135623730951}},"、":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"(":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{")":{"df":0,"docs":{},"、":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"80":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"39":{"tf":1.0},"88":{"tf":1.0}}}},"t":{"df":1,"docs":{"84":{"tf":1.0}}}},"y":{"df":1,"docs":{"123":{"tf":1.0}}}},"q":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"60":{"tf":1.0}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"41":{"tf":1.0},"63":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"114":{"tf":1.0}}}},"df":0,"docs":{},"z":{"df":2,"docs":{"27":{"tf":1.0},"54":{"tf":1.0}}}},"o":{"df":0,"docs":{},"t":{"df":3,"docs":{"113":{"tf":1.0},"120":{"tf":2.449489742783178},"85":{"tf":1.0}}}},"u":{"df":0,"docs":{},"x":{"df":1,"docs":{"60":{"tf":1.0}}}},"x":{"df":1,"docs":{"106":{"tf":1.4142135623730951}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"57":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"83":{"tf":2.0}},"e":{"!":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"83":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"r":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":5,"docs":{"21":{"tf":4.242640687119285},"22":{"tf":2.0},"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}}}}}},"df":3,"docs":{"21":{"tf":1.7320508075688772},"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951}},"r":{"df":6,"docs":{"20":{"tf":1.0},"21":{"tf":3.1622776601683795},"22":{"tf":3.1622776601683795},"23":{"tf":4.0},"24":{"tf":3.0},"25":{"tf":2.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"!":{"(":{"df":0,"docs":{},"f":{"[":{"df":0,"docs":{},"i":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":0,"docs":{}}},"[":{"a":{"[":{"df":0,"docs":{},"n":{"df":4,"docs":{"21":{"tf":1.4142135623730951},"22":{"tf":2.0},"23":{"tf":2.6457513110645907},"24":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"df":0,"docs":{},"r":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"23":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"s":{"df":3,"docs":{"41":{"tf":1.0},"91":{"tf":1.0},"96":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"85":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}}},"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"99":{"tf":1.0}}}}},"df":1,"docs":{"8":{"tf":1.0}},"u":{"df":0,"docs":{},"x":{"df":1,"docs":{"16":{"tf":1.0}}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"83":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":1,"docs":{"104":{"tf":1.0}},"f":{"df":3,"docs":{"35":{"tf":1.0},"36":{"tf":1.0},"8":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":9,"docs":{"103":{"tf":1.0},"108":{"tf":1.0},"117":{"tf":1.0},"12":{"tf":1.0},"18":{"tf":1.0},"27":{"tf":1.0},"38":{"tf":1.0},"44":{"tf":1.0},"63":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"91":{"tf":1.0}}}}}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"38":{"tf":1.4142135623730951},"57":{"tf":1.0}}}}},"p":{"df":1,"docs":{"17":{"tf":1.7320508075688772}},"e":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"17":{"tf":2.0}}}}}},"df":4,"docs":{"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951},"49":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":5,"docs":{"17":{"tf":1.0},"49":{"tf":1.7320508075688772},"50":{"tf":1.0},"90":{"tf":1.0},"95":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}}}},"l":{"a":{"c":{"df":2,"docs":{"90":{"tf":1.0},"95":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"!":{"(":{"$":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":2,"docs":{"95":{"tf":1.0},"96":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"(":{"$":{"_":{"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"79":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":1,"docs":{"79":{"tf":1.0}}},"df":4,"docs":{"90":{"tf":1.7320508075688772},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":1,"docs":{"123":{"tf":2.0}}}},"s":{"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":2,"docs":{"60":{"tf":1.0},"61":{"tf":1.0}}}}},"df":1,"docs":{"107":{"tf":2.23606797749979}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"44":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"101":{"tf":1.0},"23":{"tf":2.0}}}}}},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"104":{"tf":1.0}}},"y":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"104":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"104":{"tf":1.0},"91":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"92":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"f":{"c":{"df":3,"docs":{"18":{"tf":1.0},"47":{"tf":1.0},"78":{"tf":1.0}},"s":{"#":{"1":{"5":{"8":{"4":{"df":3,"docs":{"18":{"tf":1.0},"47":{"tf":1.0},"78":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"h":{"df":3,"docs":{"6":{"tf":1.0},"7":{"tf":2.0},"9":{"tf":1.7320508075688772}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"0":{"df":1,"docs":{"14":{"tf":1.0}}},"1":{"df":1,"docs":{"14":{"tf":1.0}}},"df":4,"docs":{"58":{"tf":1.4142135623730951},"68":{"tf":1.7320508075688772},"86":{"tf":1.0},"91":{"tf":1.4142135623730951}},"n":{"df":1,"docs":{"14":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"#":{"3":{"9":{"4":{"1":{"2":{"df":1,"docs":{"78":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"3":{"5":{"2":{"7":{"df":2,"docs":{"18":{"tf":1.0},"47":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"5":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":9,"docs":{"11":{"tf":2.0},"22":{"tf":1.0},"23":{"tf":2.0},"38":{"tf":1.0},"60":{"tf":1.0},"86":{"tf":1.0},"88":{"tf":1.0},"96":{"tf":1.0},"99":{"tf":1.0}}},"df":46,"docs":{"0":{"tf":3.1622776601683795},"10":{"tf":1.4142135623730951},"101":{"tf":1.0},"103":{"tf":1.7320508075688772},"108":{"tf":1.4142135623730951},"109":{"tf":1.7320508075688772},"114":{"tf":1.0},"12":{"tf":1.4142135623730951},"120":{"tf":1.4142135623730951},"121":{"tf":2.449489742783178},"123":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"20":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"27":{"tf":1.4142135623730951},"29":{"tf":1.0},"3":{"tf":1.7320508075688772},"31":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":1.0},"44":{"tf":1.0},"47":{"tf":1.0},"5":{"tf":2.23606797749979},"54":{"tf":1.7320508075688772},"57":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"62":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"77":{"tf":1.0},"8":{"tf":2.8284271247461903},"83":{"tf":1.0},"86":{"tf":1.4142135623730951},"88":{"tf":1.7320508075688772},"90":{"tf":1.0},"93":{"tf":1.0}},",":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"44":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"y":{"df":0,"docs":{},"m":{"df":1,"docs":{"1":{"tf":1.0}}}}},"s":{"!":{"(":{"\"":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":1,"docs":{"93":{"tf":1.0}}}}}}},"a":{"df":1,"docs":{"2":{"tf":1.0}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":3,"docs":{"23":{"tf":2.8284271247461903},"54":{"tf":1.4142135623730951},"63":{"tf":1.7320508075688772}}}},"t":{"df":1,"docs":{"83":{"tf":1.0}}}}},"df":4,"docs":{"11":{"tf":1.4142135623730951},"17":{"tf":1.0},"91":{"tf":1.0},"93":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"0":{"df":1,"docs":{"57":{"tf":1.7320508075688772}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"21":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"21":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"[":{"df":0,"docs":{},"i":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":4,"docs":{"21":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}},"df":3,"docs":{"22":{"tf":2.23606797749979},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}},"p":{"df":0,"docs":{},"o":{"df":4,"docs":{"21":{"tf":2.8284271247461903},"22":{"tf":2.8284271247461903},"23":{"tf":4.0},"24":{"tf":2.8284271247461903}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"[":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{".":{"0":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"_":{":":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"57":{"tf":1.0},"58":{"tf":1.0}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"58":{"tf":1.0}}}},"df":0,"docs":{}}},"df":1,"docs":{"57":{"tf":1.0}}},"df":10,"docs":{"105":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":2.23606797749979},"23":{"tf":2.8284271247461903},"24":{"tf":2.0},"5":{"tf":1.7320508075688772},"56":{"tf":1.0},"57":{"tf":5.0990195135927845},"58":{"tf":1.4142135623730951},"91":{"tf":1.0}}}},"m":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"38":{"tf":2.0}}}}}}},"df":0,"docs":{}}},"p":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"q":{":":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"24":{"tf":1.4142135623730951}}},"t":{"df":1,"docs":{"44":{"tf":1.0}}}},"h":{"a":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"68":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"32":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"w":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"(":{"df":1,"docs":{"91":{"tf":1.0}}},"df":1,"docs":{"91":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"!":{"(":{"$":{"(":{"$":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"61":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"61":{"tf":1.4142135623730951}},"l":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"e":{"df":2,"docs":{"122":{"tf":1.7320508075688772},"81":{"tf":1.4142135623730951}}}},"x":{"df":1,"docs":{"91":{"tf":1.0}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"91":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":4,"docs":{"22":{"tf":2.449489742783178},"23":{"tf":2.6457513110645907},"24":{"tf":2.0},"97":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"22":{"tf":1.0}}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"51":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":3,"docs":{"25":{"tf":1.4142135623730951},"92":{"tf":1.0},"96":{"tf":1.4142135623730951}}}}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"9":{"2":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"v":{"df":4,"docs":{"21":{"tf":2.0},"22":{"tf":2.0},"23":{"tf":2.8284271247461903},"24":{"tf":2.0}}}},"df":0,"docs":{}}}}},"s":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"91":{"tf":1.0}}}}}},"df":0,"docs":{}}},"_":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"77":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"!":{"(":{"\"":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"77":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"120":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"!":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"77":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"t":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"71":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"71":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"41":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"91":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"21":{"tf":1.4142135623730951},"46":{"tf":2.6457513110645907}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"120":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":3,"docs":{"109":{"tf":1.4142135623730951},"122":{"tf":2.8284271247461903},"53":{"tf":1.0}},"g":{"df":1,"docs":{"15":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":3,"docs":{"126":{"tf":1.0},"16":{"tf":1.0},"27":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"60":{"tf":1.0}}}}},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"0":{":":{"2":{"0":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{":":{"1":{"df":1,"docs":{"60":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{":":{"1":{"0":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}},"2":{"1":{"df":1,"docs":{"58":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{":":{"2":{"1":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"0":{":":{"3":{"1":{"df":1,"docs":{"88":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"2":{"4":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}},"3":{"3":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"8":{":":{"5":{"0":{"df":1,"docs":{"23":{"tf":1.0}}},"2":{"df":1,"docs":{"23":{"tf":1.0}}},"9":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}},"6":{"1":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"1":{"0":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"5":{":":{"4":{"5":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{":":{"5":{"df":1,"docs":{"99":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"84":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"16":{"tf":1.0},"21":{"tf":1.0},"38":{"tf":2.23606797749979},"54":{"tf":1.0},"8":{"tf":1.0}}}}}}},"i":{"c":{"df":5,"docs":{"106":{"tf":1.0},"23":{"tf":1.7320508075688772},"31":{"tf":1.0},"32":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}}}},"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{":":{":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"v":{"1":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"_":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"0":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{":":{":":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{":":{":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"v":{"1":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"11":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"(":{"0":{".":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"(":{"1":{"0":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"22":{"tf":2.0},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":4,"docs":{"22":{"tf":1.4142135623730951},"23":{"tf":2.0},"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"df":1,"docs":{"23":{"tf":1.0}},"i":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"2":{"0":{"1":{"8":{"df":3,"docs":{"11":{"tf":1.0},"38":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"v":{"1":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":4,"docs":{"11":{"tf":1.0},"23":{"tf":1.4142135623730951},"38":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":3,"docs":{"21":{"tf":1.0},"23":{"tf":4.123105625617661},"24":{"tf":3.1622776601683795}}},"m":{"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.0}}}}}}},"df":4,"docs":{"16":{"tf":1.0},"27":{"tf":1.0},"38":{"tf":2.8284271247461903},"44":{"tf":1.0}}}},"r":{"df":3,"docs":{"106":{"tf":1.0},"23":{"tf":1.0},"91":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}}}}}},"$":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"106":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":5,"docs":{"104":{"tf":1.0},"106":{"tf":1.0},"11":{"tf":1.7320508075688772},"88":{"tf":2.0},"90":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"46":{"tf":1.4142135623730951}}},"y":{"!":{"(":{"$":{"(":{"$":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"102":{"tf":2.0}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"102":{"tf":2.0}}}}},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"46":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":1,"docs":{"57":{"tf":1.0}},"n":{"df":0,"docs":{},"n":{"df":2,"docs":{"50":{"tf":1.0},"51":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"51":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"u":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"106":{"tf":2.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":14,"docs":{"10":{"tf":1.0},"106":{"tf":3.4641016151377544},"116":{"tf":1.0},"117":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":2.23606797749979},"23":{"tf":3.0},"24":{"tf":2.0},"31":{"tf":1.4142135623730951},"38":{"tf":2.0},"57":{"tf":2.0},"58":{"tf":1.0},"8":{"tf":1.0},"81":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"9":{"tf":1.0}}}}}},"df":0,"docs":{}}},"y":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":5,"docs":{"21":{"tf":1.0},"22":{"tf":2.0},"23":{"tf":2.0},"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}}}},"df":0,"docs":{}}},"u":{"b":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":5,"docs":{"79":{"tf":1.4142135623730951},"90":{"tf":1.4142135623730951},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0}}}}}}},"df":6,"docs":{"5":{"tf":1.4142135623730951},"79":{"tf":1.4142135623730951},"90":{"tf":1.4142135623730951},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"46":{"tf":1.4142135623730951}}}}}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"81":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"41":{"tf":1.0}}}}}},"w":{"a":{"df":0,"docs":{},"p":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":3,"docs":{"22":{"tf":2.449489742783178},"23":{"tf":2.8284271247461903},"24":{"tf":2.0}}}}}},"df":1,"docs":{"22":{"tf":1.0}}}},"df":0,"docs":{}},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"df":2,"docs":{"121":{"tf":1.7320508075688772},"14":{"tf":1.0}},"t":{"a":{"df":0,"docs":{},"x":{"df":5,"docs":{"3":{"tf":1.0},"48":{"tf":1.0},"54":{"tf":1.0},"6":{"tf":1.0},"62":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"93":{"tf":1.0}}}}},"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":2,"docs":{"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951}}}}}},"t":{"df":0,"docs":{},"t":{"df":3,"docs":{"84":{"tf":1.7320508075688772},"91":{"tf":1.7320508075688772},"96":{"tf":3.0}}}}},"df":1,"docs":{"91":{"tf":1.0}}}}},"df":2,"docs":{"61":{"tf":1.0},"93":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"91":{"tf":1.4142135623730951}}}}}},"x":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"63":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"9":{"tf":1.0}}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"1":{"tf":1.0}}},"i":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"1":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"51":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":2,"docs":{"52":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":4,"docs":{"114":{"tf":1.0},"17":{"tf":1.4142135623730951},"49":{"tf":1.7320508075688772},"96":{"tf":1.0}},"s":{"_":{"df":0,"docs":{},"f":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":0,"docs":{}}}}},"l":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"_":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}},"e":{"!":{"(":{"b":{"df":1,"docs":{"114":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"(":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"116":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"117":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"114":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"117":{"tf":1.7320508075688772}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"_":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"114":{"tf":1.0},"115":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"116":{"tf":1.0},"117":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"c":{"df":1,"docs":{"1":{"tf":1.0}}},"d":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"21":{"tf":1.0},"22":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":12,"docs":{"107":{"tf":1.4142135623730951},"15":{"tf":1.0},"17":{"tf":1.0},"41":{"tf":1.0},"46":{"tf":1.4142135623730951},"5":{"tf":2.0},"58":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772},"8":{"tf":1.0},"83":{"tf":1.0},"91":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"2":{"df":1,"docs":{"119":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":5,"docs":{"111":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":9,"docs":{"109":{"tf":1.0},"111":{"tf":1.4142135623730951},"112":{"tf":1.7320508075688772},"113":{"tf":2.449489742783178},"114":{"tf":2.0},"115":{"tf":1.7320508075688772},"116":{"tf":1.4142135623730951},"117":{"tf":1.4142135623730951},"122":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"39":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"84":{"tf":1.0}}},"l":{"df":2,"docs":{"11":{"tf":1.0},"38":{"tf":1.0}}}},"p":{"df":1,"docs":{"36":{"tf":1.0}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"120":{"tf":1.0}}}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":4,"docs":{"60":{"tf":1.7320508075688772},"61":{"tf":1.0},"88":{"tf":1.0},"99":{"tf":1.0}},"s":{"!":{"(":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"60":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"60":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":4,"docs":{"60":{"tf":1.4142135623730951},"84":{"tf":2.6457513110645907},"88":{"tf":1.0},"99":{"tf":1.0}}},"k":{"df":3,"docs":{"18":{"tf":1.0},"47":{"tf":1.0},"78":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"107":{"tf":1.0},"38":{"tf":1.4142135623730951}}},"t":{"df":5,"docs":{"116":{"tf":1.0},"121":{"tf":1.0},"20":{"tf":1.0},"31":{"tf":1.0},"37":{"tf":1.0}}}},"n":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":6,"docs":{"103":{"tf":1.0},"14":{"tf":1.0},"18":{"tf":1.4142135623730951},"47":{"tf":1.0},"48":{"tf":1.4142135623730951},"79":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"r":{"df":1,"docs":{"47":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":3,"docs":{"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.0}}}},"u":{"df":0,"docs":{},"e":{"df":5,"docs":{"101":{"tf":1.4142135623730951},"109":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"33":{"tf":1.0},"38":{"tf":1.4142135623730951}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"54":{"tf":1.0}}}}}},"t":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":5,"docs":{"104":{"tf":1.0},"107":{"tf":2.0},"41":{"tf":1.0},"61":{"tf":1.0},"85":{"tf":1.4142135623730951}}}}},"df":20,"docs":{"104":{"tf":1.0},"107":{"tf":2.23606797749979},"125":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"27":{"tf":1.4142135623730951},"39":{"tf":2.0},"41":{"tf":2.0},"46":{"tf":1.0},"48":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":2.0},"85":{"tf":2.8284271247461903},"86":{"tf":2.23606797749979},"88":{"tf":1.0},"89":{"tf":1.7320508075688772},"91":{"tf":1.7320508075688772},"93":{"tf":1.7320508075688772}},"s":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":5,"docs":{"46":{"tf":1.0},"86":{"tf":1.7320508075688772},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0}}}}},"df":0,"docs":{}},"、":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"90":{"tf":1.0}}},"y":{"df":0,"docs":{},"s":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"90":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{"df":4,"docs":{"106":{"tf":1.0},"107":{"tf":1.0},"52":{"tf":1.0},"90":{"tf":1.0}},"e":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"w":{"df":0,"docs":{},"i":{"d":{"d":{"df":0,"docs":{},"l":{"df":2,"docs":{"126":{"tf":1.0},"99":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":2,"docs":{"52":{"tf":1.4142135623730951},"91":{"tf":1.0}}}},"y":{"df":6,"docs":{"16":{"tf":1.0},"21":{"tf":1.0},"27":{"tf":1.0},"40":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"96":{"tf":1.0}},"p":{"df":0,"docs":{},"e":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"40":{"tf":1.0}}}}},"df":8,"docs":{"104":{"tf":1.0},"109":{"tf":1.0},"21":{"tf":1.7320508075688772},"22":{"tf":2.23606797749979},"23":{"tf":2.8284271247461903},"24":{"tf":2.0},"31":{"tf":1.0},"40":{"tf":1.7320508075688772}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"37":{"tf":1.0}}}}},"df":0,"docs":{}}}},"、":{"1":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}}}},"u":{"1":{"2":{"8":{"df":1,"docs":{"85":{"tf":2.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"85":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"3":{"2":{"df":5,"docs":{"117":{"tf":1.4142135623730951},"40":{"tf":1.0},"8":{"tf":1.7320508075688772},"85":{"tf":2.8284271247461903},"98":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"6":{"4":{"df":5,"docs":{"21":{"tf":2.6457513110645907},"22":{"tf":4.123105625617661},"23":{"tf":3.605551275463989},"24":{"tf":1.0},"85":{"tf":2.0}}},"df":0,"docs":{}},"8":{"df":3,"docs":{"40":{"tf":1.0},"8":{"tf":1.0},"85":{"tf":1.4142135623730951}}},"df":1,"docs":{"17":{"tf":1.0}},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"101":{"tf":1.0}}}}},"b":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"84":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"66":{"tf":2.0},"67":{"tf":1.4142135623730951},"69":{"tf":2.0}}}}}},"o":{"df":1,"docs":{"123":{"tf":1.0}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"y":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"122":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"116":{"tf":1.0},"31":{"tf":1.0}}}},"t":{"df":4,"docs":{"106":{"tf":1.0},"107":{"tf":1.0},"38":{"tf":1.0},"55":{"tf":1.0}}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"38":{"tf":1.4142135623730951},"83":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"63":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"s":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"、":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"122":{"tf":1.0},"23":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":16,"docs":{"11":{"tf":1.0},"114":{"tf":1.4142135623730951},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"117":{"tf":1.4142135623730951},"119":{"tf":1.0},"22":{"tf":2.8284271247461903},"23":{"tf":3.605551275463989},"24":{"tf":2.449489742783178},"25":{"tf":1.4142135623730951},"31":{"tf":1.0},"38":{"tf":1.0},"55":{"tf":1.0},"77":{"tf":1.0},"8":{"tf":1.0},"99":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"10":{"tf":2.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"a":{"!":{"(":{"a":{"df":2,"docs":{"24":{"tf":1.7320508075688772},"54":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"24":{"tf":1.7320508075688772},"54":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"z":{"df":9,"docs":{"120":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":2.8284271247461903},"23":{"tf":5.656854249492381},"24":{"tf":2.8284271247461903},"25":{"tf":1.0},"88":{"tf":1.4142135623730951},"96":{"tf":1.0},"97":{"tf":1.0}}}}}},"v":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"9":{"tf":2.0}},"i":{"d":{"df":1,"docs":{"58":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":3,"docs":{"23":{"tf":2.0},"54":{"tf":1.0},"57":{"tf":1.4142135623730951}}}},"r":{"df":1,"docs":{"7":{"tf":2.23606797749979}},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":4,"docs":{"17":{"tf":1.0},"48":{"tf":1.0},"54":{"tf":1.0},"57":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"107":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":2,"docs":{"107":{"tf":2.8284271247461903},"117":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":2,"docs":{"17":{"tf":1.7320508075688772},"50":{"tf":1.0}},"e":{"c":{"!":{"[":{"0":{"df":0,"docs":{},"u":{"6":{"4":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.0}},"s":{"!":{"[":{"1":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":2,"docs":{"17":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{},"y":{"df":0,"docs":{},"k":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"123":{"tf":1.0}}}}}}}},"i":{"df":6,"docs":{"104":{"tf":1.0},"106":{"tf":1.7320508075688772},"16":{"tf":1.0},"27":{"tf":1.0},"41":{"tf":2.8284271247461903},"44":{"tf":1.0}},"s":{":":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":4,"docs":{"104":{"tf":1.0},"106":{"tf":1.7320508075688772},"107":{"tf":1.0},"41":{"tf":2.23606797749979}}}}},"_":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"41":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"41":{"tf":2.0}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"60":{"tf":2.23606797749979}}},"r":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"38":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":1,"docs":{"38":{"tf":1.4142135623730951}}}}},"df":1,"docs":{"17":{"tf":1.0}},"e":{"_":{"c":{"a":{"df":0,"docs":{},"n":{"_":{"d":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"77":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":1,"docs":{"15":{"tf":1.7320508075688772}}}}},"t":{"_":{"df":0,"docs":{},"i":{"df":2,"docs":{"46":{"tf":1.0},"57":{"tf":1.0}},"s":{"!":{"(":{"#":{"[":{"$":{"df":0,"docs":{},"m":{"df":1,"docs":{"46":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"46":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"57":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"91":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"60":{"tf":3.0}}}}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"22":{"tf":2.6457513110645907},"23":{"tf":2.8284271247461903},"24":{"tf":2.0}}}}},"df":0,"docs":{},"p":{"df":1,"docs":{"60":{"tf":1.0}}}},"p":{"df":2,"docs":{"105":{"tf":1.0},"108":{"tf":1.0}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"41":{"tf":1.0}}},"l":{"d":{"!":{"\"":{"df":0,"docs":{},"、":{"3":{".":{"1":{"4":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":4,"docs":{"11":{"tf":2.0},"33":{"tf":1.0},"77":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"2":{"df":2,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"s":{"df":2,"docs":{"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"x":{"!":{"(":{"1":{"df":1,"docs":{"68":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"68":{"tf":1.7320508075688772}}},"3":{"df":1,"docs":{"68":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"7":{"df":1,"docs":{"61":{"tf":1.0}}},"8":{"df":1,"docs":{"61":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"7":{"df":0,"docs":{},"f":{"df":1,"docs":{"61":{"tf":1.0}}}},"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"12":{"tf":1.0}}}}}},"df":12,"docs":{"101":{"tf":1.7320508075688772},"17":{"tf":1.4142135623730951},"43":{"tf":1.0},"65":{"tf":2.0},"66":{"tf":3.0},"67":{"tf":2.449489742783178},"68":{"tf":1.7320508075688772},"69":{"tf":3.605551275463989},"70":{"tf":1.0},"75":{"tf":1.4142135623730951},"76":{"tf":3.872983346207417},"9":{"tf":1.7320508075688772}},"o":{"d":{"df":1,"docs":{"60":{"tf":1.0}}},"df":0,"docs":{}}},"y":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"99":{"tf":1.0}}}}}}}}},"df":8,"docs":{"12":{"tf":1.0},"17":{"tf":1.4142135623730951},"23":{"tf":2.449489742783178},"67":{"tf":2.23606797749979},"69":{"tf":3.0},"70":{"tf":2.0},"75":{"tf":1.4142135623730951},"76":{"tf":2.6457513110645907}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"5":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"1":{"tf":1.0}}}}}}},"z":{"df":5,"docs":{"17":{"tf":1.4142135623730951},"23":{"tf":2.0},"60":{"tf":1.4142135623730951},"88":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"101":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"28":{"tf":1.0},"38":{"tf":2.23606797749979}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"=":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"11":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"38":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"breadcrumbs":{"root":{"0":{".":{".":{"2":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":2,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"df":2,"docs":{"35":{"tf":1.0},"36":{"tf":1.0}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":2,"docs":{"23":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"1":{"2":{"3":{"4":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"_":{"_":{"_":{"_":{"_":{"_":{"0":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"0":{"0":{"0":{"1":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"0":{"0":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"0":{"0":{"0":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":22,"docs":{"10":{"tf":2.23606797749979},"101":{"tf":2.23606797749979},"102":{"tf":1.7320508075688772},"115":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"20":{"tf":1.7320508075688772},"21":{"tf":4.47213595499958},"22":{"tf":3.0},"23":{"tf":5.0},"24":{"tf":2.23606797749979},"35":{"tf":1.0},"36":{"tf":1.7320508075688772},"49":{"tf":2.0},"58":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"79":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"88":{"tf":4.69041575982343},"96":{"tf":1.0},"97":{"tf":1.0},"99":{"tf":4.795831523312719}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":2,"docs":{"95":{"tf":1.4142135623730951},"96":{"tf":2.0}}}}}}},"1":{"+":{"2":{"df":1,"docs":{"6":{"tf":1.0}}},"a":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}},".":{"0":{"df":1,"docs":{"24":{"tf":1.0}},"e":{"df":1,"docs":{"5":{"tf":1.0}}}},"1":{"4":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"2":{"df":4,"docs":{"5":{"tf":1.0},"86":{"tf":1.0},"90":{"tf":1.0},"96":{"tf":1.0}}},"3":{"0":{"df":2,"docs":{"76":{"tf":1.0},"86":{"tf":1.0}}},"1":{"df":1,"docs":{"77":{"tf":1.0}}},"df":0,"docs":{}},"5":{"2":{"df":2,"docs":{"44":{"tf":1.0},"5":{"tf":1.0}}},"4":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"6":{"0":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"0":{"0":{"0":{"df":1,"docs":{"97":{"tf":1.0}}},"df":0,"docs":{}},"df":3,"docs":{"22":{"tf":1.0},"85":{"tf":1.4142135623730951},"89":{"tf":1.4142135623730951}}},"df":5,"docs":{"24":{"tf":2.23606797749979},"38":{"tf":1.4142135623730951},"54":{"tf":2.23606797749979},"57":{"tf":1.0},"99":{"tf":1.7320508075688772}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}}}},"1":{"df":2,"docs":{"57":{"tf":1.0},"60":{"tf":1.0}}},"2":{"0":{"df":1,"docs":{"24":{"tf":1.0}}},"8":{"df":3,"docs":{"85":{"tf":1.0},"9":{"tf":1.4142135623730951},"96":{"tf":1.7320508075688772}}},"df":4,"docs":{"38":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0},"90":{"tf":1.0}}},"3":{"df":3,"docs":{"104":{"tf":1.0},"22":{"tf":1.4142135623730951},"54":{"tf":1.0}}},"4":{"df":1,"docs":{"27":{"tf":1.0}}},"df":40,"docs":{"0":{"tf":1.0},"101":{"tf":2.23606797749979},"102":{"tf":4.358898943540674},"110":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"17":{"tf":1.0},"20":{"tf":2.6457513110645907},"21":{"tf":6.324555320336759},"22":{"tf":4.47213595499958},"23":{"tf":7.54983443527075},"24":{"tf":3.605551275463989},"27":{"tf":1.0},"33":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.7320508075688772},"41":{"tf":1.0},"44":{"tf":1.4142135623730951},"47":{"tf":1.0},"49":{"tf":1.4142135623730951},"5":{"tf":1.0},"54":{"tf":1.0},"58":{"tf":1.0},"6":{"tf":1.0},"68":{"tf":1.4142135623730951},"79":{"tf":2.449489742783178},"8":{"tf":2.23606797749979},"80":{"tf":1.0},"83":{"tf":1.4142135623730951},"84":{"tf":1.0},"85":{"tf":1.4142135623730951},"88":{"tf":4.123105625617661},"89":{"tf":1.4142135623730951},"9":{"tf":2.449489742783178},"95":{"tf":1.4142135623730951},"96":{"tf":1.0},"97":{"tf":1.4142135623730951},"99":{"tf":6.48074069840786}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":2,"docs":{"95":{"tf":1.7320508075688772},"96":{"tf":2.0}},"e":{"`":{"df":1,"docs":{"95":{"tf":1.0}}},"df":0,"docs":{}}}}}},"相":{"df":0,"docs":{},"比":{"df":0,"docs":{},"较":{"df":0,"docs":{},":":{"df":0,"docs":{},"匹":{"df":0,"docs":{},"配":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"2":{".":{"0":{"df":6,"docs":{"125":{"tf":1.0},"3":{"tf":1.0},"78":{"tf":1.7320508075688772},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.0}},"、":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"、":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"78":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"3":{"df":1,"docs":{"33":{"tf":1.0}}},"df":0,"docs":{}},"0":{"1":{"5":{"df":4,"docs":{"123":{"tf":1.0},"73":{"tf":1.4142135623730951},"74":{"tf":1.4142135623730951},"86":{"tf":1.0}}},"6":{"df":2,"docs":{"0":{"tf":1.0},"123":{"tf":1.0}}},"8":{"df":6,"docs":{"123":{"tf":1.0},"25":{"tf":1.0},"73":{"tf":1.4142135623730951},"76":{"tf":1.0},"77":{"tf":2.0},"86":{"tf":1.0}}},"df":0,"docs":{}},"2":{"1":{".":{"0":{"6":{"df":1,"docs":{"126":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"35":{"tf":1.0},"36":{"tf":1.0},"44":{"tf":1.0}}},"2":{".":{"0":{"4":{"df":1,"docs":{"125":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"88":{"tf":1.0},"96":{"tf":1.0}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}}}},"1":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}},"4":{"df":2,"docs":{"24":{"tf":1.0},"54":{"tf":1.0}}},"5":{"6":{"0":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":31,"docs":{"0":{"tf":1.0},"101":{"tf":1.4142135623730951},"102":{"tf":2.6457513110645907},"113":{"tf":1.0},"116":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"20":{"tf":1.4142135623730951},"21":{"tf":4.69041575982343},"22":{"tf":3.872983346207417},"23":{"tf":4.47213595499958},"24":{"tf":1.7320508075688772},"27":{"tf":1.0},"28":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.7320508075688772},"44":{"tf":1.0},"48":{"tf":1.0},"5":{"tf":1.0},"57":{"tf":2.6457513110645907},"6":{"tf":1.0},"68":{"tf":1.4142135623730951},"8":{"tf":1.7320508075688772},"84":{"tf":1.0},"88":{"tf":3.872983346207417},"89":{"tf":1.0},"9":{"tf":2.0},"95":{"tf":1.0},"96":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951},"99":{"tf":3.7416573867739413}},"相":{"df":0,"docs":{},"比":{"df":0,"docs":{},"较":{"df":0,"docs":{},":":{"df":0,"docs":{},"匹":{"df":0,"docs":{},"配":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"(":{"df":0,"docs":{},"或":{"df":0,"docs":{},"者":{"df":0,"docs":{},"在":{"df":0,"docs":{},"这":{"df":0,"docs":{},"种":{"df":0,"docs":{},"情":{"df":0,"docs":{},"况":{"df":0,"docs":{},"下":{"df":0,"docs":{},",":{"df":0,"docs":{},"向":{"df":0,"docs":{},"左":{"df":0,"docs":{},"移":{"1":{"df":1,"docs":{"99":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}}}},"3":{".":{"1":{"4":{"1":{"5":{"9":{"df":1,"docs":{"17":{"tf":1.0}},"f":{"3":{"2":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"]":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"22":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"22":{"tf":1.0}}},"6":{"2":{"8":{"8":{"0":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"df":1,"docs":{"104":{"tf":1.4142135623730951}}},"df":24,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"102":{"tf":2.6457513110645907},"117":{"tf":1.0},"122":{"tf":1.0},"15":{"tf":1.4142135623730951},"17":{"tf":1.0},"20":{"tf":1.0},"22":{"tf":1.4142135623730951},"23":{"tf":1.4142135623730951},"35":{"tf":1.0},"36":{"tf":1.7320508075688772},"38":{"tf":3.3166247903554},"46":{"tf":1.0},"5":{"tf":1.0},"68":{"tf":1.4142135623730951},"8":{"tf":2.0},"88":{"tf":4.0},"9":{"tf":2.0},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.4142135623730951},"98":{"tf":1.0},"99":{"tf":3.1622776601683795}}},"4":{".":{"0":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}},"0":{"3":{"2":{"0":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"5":{"tf":1.0}}},"2":{"df":7,"docs":{"10":{"tf":1.7320508075688772},"106":{"tf":1.0},"24":{"tf":2.0},"5":{"tf":1.0},"54":{"tf":2.0},"84":{"tf":1.0},"86":{"tf":1.7320508075688772}},"i":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":10,"docs":{"102":{"tf":4.47213595499958},"15":{"tf":1.4142135623730951},"18":{"tf":1.0},"20":{"tf":1.0},"24":{"tf":1.0},"5":{"tf":1.0},"8":{"tf":1.4142135623730951},"88":{"tf":1.4142135623730951},"97":{"tf":1.0},"99":{"tf":1.7320508075688772}}},"5":{"0":{"0":{"df":1,"docs":{"95":{"tf":2.0}}},"4":{"0":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"16":{"tf":1.0},"22":{"tf":1.4142135623730951},"98":{"tf":1.0},"99":{"tf":2.23606797749979}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}}}},"6":{"8":{"df":1,"docs":{"23":{"tf":2.0}}},"df":4,"docs":{"17":{"tf":1.4142135623730951},"24":{"tf":1.0},"46":{"tf":1.4142135623730951},"99":{"tf":2.0}}},"7":{"2":{"0":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{},"u":{"3":{"2":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"5":{"df":1,"docs":{"22":{"tf":1.0}}},"df":1,"docs":{"99":{"tf":2.6457513110645907}}},"8":{"df":4,"docs":{"22":{"tf":1.4142135623730951},"38":{"tf":1.0},"57":{"tf":1.0},"99":{"tf":1.7320508075688772}}},"9":{"8":{"df":1,"docs":{"85":{"tf":1.0}}},"9":{"df":1,"docs":{"85":{"tf":1.0}}},"df":3,"docs":{"27":{"tf":1.0},"57":{"tf":1.4142135623730951},"99":{"tf":2.449489742783178}}},"_":{"0":{"df":1,"docs":{"23":{"tf":2.449489742783178}}},"1":{"df":1,"docs":{"23":{"tf":2.23606797749979}}},"2":{"df":1,"docs":{"23":{"tf":2.0}}},"3":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}},"_":{"_":{"_":{"_":{"df":1,"docs":{"57":{"tf":1.0}},"o":{"_":{"_":{"_":{"_":{"_":{"df":1,"docs":{"30":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"0":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"98":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"a":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.8284271247461903}}}}},"df":0,"docs":{}},"b":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.449489742783178}}}}},"df":0,"docs":{}},"c":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.449489742783178}}}}},"df":0,"docs":{}},"d":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.449489742783178}}}}},"df":0,"docs":{}},"df":10,"docs":{"106":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"30":{"tf":1.4142135623730951},"32":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"5":{"tf":1.0},"56":{"tf":1.0},"58":{"tf":2.6457513110645907},"61":{"tf":1.4142135623730951}},"e":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"88":{"tf":1.7320508075688772}}}}}},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.449489742783178}}}}},"df":0,"docs":{}},"f":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.0}}}}},"df":0,"docs":{}},"g":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.0}}}}},"df":0,"docs":{}},"h":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.0}}}}},"df":0,"docs":{},"e":{"a":{"d":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"i":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.0}}}}},"df":0,"docs":{}},"j":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.0}}}}},"df":0,"docs":{}},"k":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"l":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"m":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"n":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"o":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"p":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"q":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"r":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"s":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"91":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"t":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":5,"docs":{"79":{"tf":1.0},"90":{"tf":1.4142135623730951},"95":{"tf":1.0},"96":{"tf":1.7320508075688772},"97":{"tf":1.0}}}}},"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"60":{"tf":1.0}}}}},"df":0,"docs":{}}}},"a":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"y":{"!":{"(":{"$":{"(":{"$":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"91":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}},":":{":":{"b":{":":{":":{"c":{":":{":":{"d":{"df":1,"docs":{"37":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"i":{"d":{"df":3,"docs":{"24":{"tf":1.0},"54":{"tf":1.0},"91":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"t":{"df":3,"docs":{"46":{"tf":1.0},"79":{"tf":2.0},"99":{"tf":2.0}}}}},"[":{"df":0,"docs":{},"n":{"df":4,"docs":{"21":{"tf":7.280109889280518},"22":{"tf":4.0},"23":{"tf":4.795831523312719},"24":{"tf":1.4142135623730951}}}},"b":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"91":{"tf":1.0}}}}},"a":{"c":{"df":0,"docs":{},"u":{"df":2,"docs":{"101":{"tf":2.0},"102":{"tf":2.8284271247461903}},"s":{"!":{"(":{"$":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"101":{"tf":1.0}}}}}},"(":{"$":{"(":{"$":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"101":{"tf":2.0},"102":{"tf":2.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"57":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"(":{"0":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}},"1":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}},"3":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":1,"docs":{"88":{"tf":4.0}},"u":{"df":0,"docs":{},"l":{"df":3,"docs":{"39":{"tf":1.0},"88":{"tf":1.0},"89":{"tf":1.0}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"115":{"tf":1.0},"117":{"tf":1.0}}}}}},"d":{"d":{"df":3,"docs":{"6":{"tf":1.0},"7":{"tf":2.0},"9":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"46":{"tf":1.4142135623730951}}}}},"df":1,"docs":{"23":{"tf":2.449489742783178}}},"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"(":{"d":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"c":{"df":0,"docs":{},"o":{"d":{"df":4,"docs":{"106":{"tf":1.0},"8":{"tf":1.0},"93":{"tf":1.0},"98":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"99":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":4,"docs":{"22":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"!":{"(":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"45":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"115":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"y":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"48":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"i":{"]":{"[":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"121":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"119":{"tf":1.0}}}},"r":{"df":0,"docs":{},"g":{"0":{"df":2,"docs":{"11":{"tf":1.0},"8":{"tf":1.0}}},"1":{"df":1,"docs":{"8":{"tf":1.0}}},"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"104":{"tf":1.0}},"e":{":":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"104":{"tf":1.0}}},"y":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"104":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":2,"docs":{"8":{"tf":3.0},"83":{"tf":1.0}},"s":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"83":{"tf":1.0}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.0},"41":{"tf":1.0}}}}}}}},"r":{"a":{"df":0,"docs":{},"y":{"df":2,"docs":{"88":{"tf":1.7320508075688772},"97":{"tf":1.4142135623730951}}}},"df":1,"docs":{"7":{"tf":1.0}}}},"s":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"!":{"(":{"$":{"(":{"$":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"86":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"2":{"df":1,"docs":{"93":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"86":{"tf":2.8284271247461903},"87":{"tf":1.0},"88":{"tf":2.23606797749979},"93":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"!":{"df":0,"docs":{},"{":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"93":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":1,"docs":{"93":{"tf":1.0}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"_":{"df":1,"docs":{"93":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"93":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"93":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":1,"docs":{"93":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"93":{"tf":1.0}}},"y":{"!":{"(":{"_":{"df":1,"docs":{"93":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"34":{"tf":1.0},"37":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"!":{"(":{"2":{"5":{"0":{"0":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"0":{"0":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"0":{"df":1,"docs":{"23":{"tf":2.449489742783178}}},"1":{"df":1,"docs":{"23":{"tf":2.23606797749979}}},"2":{"df":1,"docs":{"23":{"tf":2.0}}},"3":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"!":{"(":{"0":{"df":4,"docs":{"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"98":{"tf":1.0}}}}}}},"df":1,"docs":{"17":{"tf":1.0}},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"101":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"!":{"(":{"4":{"2":{"df":1,"docs":{"86":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"(":{"1":{"3":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"88":{"tf":1.0}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"90":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"x":{"df":1,"docs":{"70":{"tf":2.23606797749979}}}},"df":0,"docs":{}},"df":1,"docs":{"91":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"t":{"df":14,"docs":{"14":{"tf":1.0},"16":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"27":{"tf":1.0},"46":{"tf":1.4142135623730951},"6":{"tf":1.7320508075688772},"7":{"tf":2.23606797749979},"8":{"tf":2.449489742783178},"9":{"tf":3.1622776601683795},"93":{"tf":2.0},"95":{"tf":1.0},"97":{"tf":1.0},"99":{"tf":1.0}}},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"30":{"tf":1.0}}},"df":0,"docs":{}}},"、":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"44":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"50":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"48":{"tf":1.0}}}}}},"r":{"df":1,"docs":{"115":{"tf":1.7320508075688772}},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":7,"docs":{"104":{"tf":1.0},"106":{"tf":2.23606797749979},"107":{"tf":1.4142135623730951},"117":{"tf":1.0},"34":{"tf":1.0},"46":{"tf":2.0},"8":{"tf":2.0}},"e":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"0":{"df":1,"docs":{"117":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"l":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"117":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"57":{"tf":1.0}}}}},"df":0,"docs":{}},"与":{"df":0,"docs":{},"n":{"df":1,"docs":{"24":{"tf":1.0}}}}},"b":{"'":{"b":{"df":1,"docs":{"33":{"tf":1.0}}},"df":0,"docs":{}},"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"y":{"!":{"(":{"$":{"(":{"$":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"91":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}},":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"91":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"t":{"df":3,"docs":{"46":{"tf":1.0},"79":{"tf":1.4142135623730951},"99":{"tf":1.4142135623730951}}}}},"a":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":10,"docs":{"104":{"tf":1.0},"106":{"tf":2.23606797749979},"107":{"tf":1.7320508075688772},"114":{"tf":1.0},"115":{"tf":1.0},"117":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.0},"48":{"tf":2.0},"60":{"tf":1.0}}},"s":{"df":0,"docs":{},"e":{"df":2,"docs":{"107":{"tf":1.0},"63":{"tf":1.0}}}},"z":{"(":{"2":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"104":{"tf":1.4142135623730951},"106":{"tf":2.0},"107":{"tf":1.7320508075688772},"31":{"tf":1.0},"60":{"tf":1.0}}}},"df":17,"docs":{"12":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"22":{"tf":2.6457513110645907},"23":{"tf":2.0},"24":{"tf":1.4142135623730951},"65":{"tf":1.0},"66":{"tf":1.4142135623730951},"67":{"tf":1.0},"69":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"70":{"tf":1.4142135623730951},"8":{"tf":1.0},"84":{"tf":2.0},"91":{"tf":2.6457513110645907},"98":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"22":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"5":{"tf":1.4142135623730951}}}}},"n":{"d":{"df":1,"docs":{"81":{"tf":1.0}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"60":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"d":{"df":1,"docs":{"57":{"tf":1.0}}},"df":3,"docs":{"25":{"tf":1.4142135623730951},"60":{"tf":1.0},"88":{"tf":1.0}},"o":{"df":0,"docs":{},"p":{"df":3,"docs":{"6":{"tf":1.0},"7":{"tf":2.0},"9":{"tf":1.7320508075688772}}}}},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"83":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"t":{"df":2,"docs":{"126":{"tf":1.0},"99":{"tf":1.7320508075688772}},"f":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{":":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":5,"docs":{"16":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":2.6457513110645907},"31":{"tf":1.0},"44":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"e":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}}},"o":{"d":{"df":0,"docs":{},"i":{"df":5,"docs":{"104":{"tf":1.0},"57":{"tf":1.4142135623730951},"58":{"tf":1.0},"88":{"tf":3.0},"9":{"tf":1.0}}},"y":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":2,"docs":{"57":{"tf":1.4142135623730951},"58":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"88":{"tf":3.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":3,"docs":{"0":{"tf":1.7320508075688772},"12":{"tf":1.0},"19":{"tf":1.0}}},"l":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"40":{"tf":1.0},"90":{"tf":1.0}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"22":{"tf":1.0}}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"14":{"tf":1.0}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"41":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":2,"docs":{"23":{"tf":1.4142135623730951},"29":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"8":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":4,"docs":{"22":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0},"8":{"tf":1.0}}}}},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"91":{"tf":1.0}}}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"e":{"df":1,"docs":{"70":{"tf":1.4142135623730951}}}}},"c":{"!":{"(":{"$":{"df":0,"docs":{},"i":{"df":1,"docs":{"57":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"/":{"c":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"$":{"df":0,"docs":{},"i":{":":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"a":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"b":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"!":{"(":{"$":{"a":{"b":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"91":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"55":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"57":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"57":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"l":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"!":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"83":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"83":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"!":{"(":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"(":{"\"":{"df":0,"docs":{},"y":{"df":1,"docs":{"83":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"83":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},":":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"83":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":1,"docs":{"83":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"122":{"tf":1.0},"41":{"tf":1.4142135623730951},"58":{"tf":1.4142135623730951},"91":{"tf":2.23606797749979}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}},"s":{"!":{"(":{"(":{"c":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"df":1,"docs":{"46":{"tf":1.0}}},"5":{"df":1,"docs":{"46":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":1,"docs":{"46":{"tf":1.0}},"s":{"!":{"(":{"#":{"[":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"46":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"91":{"tf":1.4142135623730951}}},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"109":{"tf":1.0}}}}}}},"df":6,"docs":{"109":{"tf":1.0},"11":{"tf":1.4142135623730951},"38":{"tf":1.0},"60":{"tf":1.0},"88":{"tf":1.0},"99":{"tf":1.7320508075688772}}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"107":{"tf":1.0}}},"t":{"df":1,"docs":{"98":{"tf":1.0}}}}},"c":{"df":1,"docs":{"2":{"tf":1.0}}},"df":10,"docs":{"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"5":{"tf":1.4142135623730951},"65":{"tf":1.0},"66":{"tf":1.4142135623730951},"67":{"tf":1.0},"69":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"84":{"tf":1.7320508075688772},"98":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":3.872983346207417},"24":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"22":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"101":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"22":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"83":{"tf":1.4142135623730951}}}}}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":3,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.4142135623730951},"88":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"r":{"df":1,"docs":{"1":{"tf":1.0}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":2,"docs":{"123":{"tf":1.4142135623730951},"22":{"tf":1.0}}}},"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"8":{"tf":2.0}}}}},"m":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"(":{"df":1,"docs":{"91":{"tf":1.0}}},"df":1,"docs":{"91":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}},"n":{"c":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"\"":{"$":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}}}}},"a":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"46":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"57":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}}},"df":6,"docs":{"23":{"tf":4.47213595499958},"24":{"tf":1.4142135623730951},"25":{"tf":1.0},"8":{"tf":2.0},"97":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"48":{"tf":1.0}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"y":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"22":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{":":{":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"v":{"1":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"v":{"1":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"0":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":1,"docs":{"11":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"$":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":1,"docs":{"49":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"49":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"18":{"tf":1.4142135623730951},"47":{"tf":1.0},"49":{"tf":2.23606797749979}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},",":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{")":{"*":{")":{"df":0,"docs":{},"并":{"df":0,"docs":{},"替":{"df":0,"docs":{},"换":{"df":0,"docs":{},"为":{"(":{"$":{"(":{"$":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"101":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"x":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"101":{"tf":3.605551275463989},"102":{"tf":2.449489742783178}}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":3,"docs":{"23":{"tf":3.872983346207417},"24":{"tf":1.4142135623730951},"25":{"tf":1.7320508075688772}},"s":{"!":{"(":{"$":{"(":{"$":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"23":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"1":{"df":1,"docs":{"23":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{},"x":{"df":1,"docs":{"23":{"tf":3.3166247903554}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"i":{"d":{"df":1,"docs":{"98":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"!":{"(":{"a":{"df":1,"docs":{"98":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"t":{"df":6,"docs":{"101":{"tf":1.7320508075688772},"79":{"tf":1.4142135623730951},"95":{"tf":1.0},"96":{"tf":2.449489742783178},"97":{"tf":1.0},"99":{"tf":3.4641016151377544}},"s":{"!":{"(":{"$":{"(":{"$":{"a":{"df":2,"docs":{"79":{"tf":2.0},"99":{"tf":2.0}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"96":{"tf":3.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"df":2,"docs":{"97":{"tf":1.0},"99":{"tf":2.449489742783178}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"101":{"tf":1.4142135623730951}}}}},"_":{"df":1,"docs":{"79":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":4,"docs":{"101":{"tf":3.1622776601683795},"102":{"tf":2.449489742783178},"49":{"tf":1.0},"98":{"tf":1.7320508075688772}}}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"55":{"tf":1.0}}}}}},"i":{"df":1,"docs":{"76":{"tf":1.0}},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"55":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"=":{"\"":{"b":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"8":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":23,"docs":{"109":{"tf":2.449489742783178},"11":{"tf":1.0},"113":{"tf":1.0},"118":{"tf":3.0},"119":{"tf":1.0},"120":{"tf":1.4142135623730951},"121":{"tf":1.0},"16":{"tf":1.7320508075688772},"23":{"tf":1.0},"25":{"tf":2.23606797749979},"31":{"tf":1.0},"38":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":3.1622776601683795},"69":{"tf":3.1622776601683795},"71":{"tf":1.0},"72":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":4.0},"77":{"tf":2.23606797749979},"86":{"tf":1.0},"9":{"tf":1.0},"99":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{}}}},"z":{"df":0,"docs":{},"i":{"df":1,"docs":{"84":{"tf":1.0}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"22":{"tf":1.0}}}}},"d":{"[":{"0":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":3,"docs":{"17":{"tf":1.4142135623730951},"22":{"tf":1.0},"7":{"tf":1.4142135623730951}},"e":{"a":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"43":{"tf":1.0}},"e":{"!":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"43":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"99":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":1,"docs":{"84":{"tf":1.0}}},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"38":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"5":{"tf":1.7320508075688772},"55":{"tf":1.0},"65":{"tf":1.7320508075688772},"66":{"tf":1.7320508075688772},"67":{"tf":1.4142135623730951},"69":{"tf":2.6457513110645907}},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"122":{"tf":1.0},"31":{"tf":2.6457513110645907},"81":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":6,"docs":{"18":{"tf":2.0},"47":{"tf":1.0},"48":{"tf":1.0},"49":{"tf":2.0},"50":{"tf":1.0},"51":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":7,"docs":{"104":{"tf":1.4142135623730951},"110":{"tf":1.0},"113":{"tf":1.4142135623730951},"116":{"tf":3.7416573867739413},"117":{"tf":2.449489742783178},"121":{"tf":1.4142135623730951},"8":{"tf":1.0}},"e":{"(":{"$":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"110":{"tf":1.0}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"106":{"tf":1.0},"107":{"tf":1.0},"8":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"116":{"tf":1.0},"117":{"tf":1.4142135623730951}},"v":{"df":1,"docs":{"116":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"121":{"tf":1.4142135623730951}}}}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"91":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"i":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"62":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":1,"docs":{"84":{"tf":1.4142135623730951}},"s":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"c":{"df":1,"docs":{"34":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"91":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"48":{"tf":2.0}}}},"df":0,"docs":{}}},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"83":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"(":{"$":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"_":{"df":1,"docs":{"58":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"57":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"57":{"tf":1.7320508075688772}}}}}}},"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"57":{"tf":2.0},"58":{"tf":2.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"n":{"df":2,"docs":{"39":{"tf":1.0},"88":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":4,"docs":{"57":{"tf":3.0},"58":{"tf":1.4142135623730951},"8":{"tf":1.0},"93":{"tf":1.0}}},"y":{"(":{"4":{")":{".":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"(":{")":{".":{"0":{"df":2,"docs":{"57":{"tf":2.0},"58":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"3":{"2":{"df":2,"docs":{"57":{"tf":2.0},"58":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"+":{"1":{"df":1,"docs":{"88":{"tf":1.0}}},"2":{"df":1,"docs":{"88":{"tf":1.0}}},"3":{"df":1,"docs":{"88":{"tf":1.0}}},"df":0,"docs":{}},".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"88":{"tf":6.557438524302}}}}}},"df":0,"docs":{}},"0":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"23":{"tf":2.0}}}}}}},"df":0,"docs":{}},"1":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"23":{"tf":2.0}}}}}}},"df":0,"docs":{}},"2":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"23":{"tf":1.0}}}}}}},"df":1,"docs":{"23":{"tf":1.0}}},":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":10,"docs":{"11":{"tf":1.0},"16":{"tf":2.23606797749979},"23":{"tf":2.0},"24":{"tf":1.7320508075688772},"43":{"tf":1.0},"46":{"tf":1.0},"54":{"tf":1.4142135623730951},"86":{"tf":2.0},"88":{"tf":3.7416573867739413},"93":{"tf":1.0}}}}}}},"a":{"c":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"!":{"(":{"$":{"(":{"$":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"60":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"60":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"60":{"tf":1.4142135623730951}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"60":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"60":{"tf":3.1622776601683795}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"d":{"d":{"df":0,"docs":{},"y":{"b":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"35":{"tf":1.0},"36":{"tf":1.0},"44":{"tf":1.0}}}}},"df":13,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"16":{"tf":2.449489742783178},"17":{"tf":1.4142135623730951},"21":{"tf":2.8284271247461903},"22":{"tf":2.8284271247461903},"23":{"tf":2.6457513110645907},"24":{"tf":2.6457513110645907},"54":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772},"86":{"tf":1.7320508075688772},"88":{"tf":5.830951894845301},"93":{"tf":1.0}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":2.0}},"i":{"df":1,"docs":{"91":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.0}}}}}}},"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.0},"38":{"tf":1.0}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"41":{"tf":1.0},"88":{"tf":1.0}}}}}},"n":{"d":{"df":1,"docs":{"5":{"tf":1.4142135623730951}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"107":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"107":{"tf":2.0}},"e":{"df":0,"docs":{},"r":{"!":{"(":{"@":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"107":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":4,"docs":{"107":{"tf":2.6457513110645907},"117":{"tf":1.0},"31":{"tf":1.0},"98":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}},"、":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"116":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"101":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"[":{"df":0,"docs":{},"e":{"0":{"4":{"2":{"4":{"df":1,"docs":{"57":{"tf":1.0}}},"5":{"df":2,"docs":{"23":{"tf":2.0},"54":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":8,"docs":{"17":{"tf":1.0},"22":{"tf":1.0},"41":{"tf":1.4142135623730951},"45":{"tf":1.0},"48":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0},"68":{"tf":1.7320508075688772}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":2,"docs":{"79":{"tf":1.4142135623730951},"99":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"x":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"51":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":3,"docs":{"12":{"tf":1.0},"18":{"tf":1.0},"78":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"91":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"83":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":9,"docs":{"11":{"tf":1.0},"120":{"tf":1.0},"23":{"tf":1.4142135623730951},"24":{"tf":1.0},"38":{"tf":1.0},"47":{"tf":1.0},"60":{"tf":2.23606797749979},"88":{"tf":2.449489742783178},"99":{"tf":2.6457513110645907}}},"df":0,"docs":{},"s":{"df":6,"docs":{"14":{"tf":2.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"18":{"tf":1.0},"47":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"57":{"tf":1.0},"58":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"63":{"tf":1.0}}}}},"r":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"29":{"tf":1.0}}}}}}},"df":7,"docs":{"11":{"tf":1.0},"120":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"27":{"tf":1.0},"29":{"tf":1.7320508075688772},"44":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":9,"docs":{"16":{"tf":1.0},"18":{"tf":1.0},"21":{"tf":1.0},"29":{"tf":1.7320508075688772},"33":{"tf":1.0},"40":{"tf":1.0},"48":{"tf":1.0},"52":{"tf":1.0},"8":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"3":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"df":9,"docs":{"11":{"tf":1.0},"23":{"tf":1.0},"31":{"tf":1.4142135623730951},"38":{"tf":1.0},"69":{"tf":1.7320508075688772},"75":{"tf":1.0},"76":{"tf":2.23606797749979},"77":{"tf":1.0},"99":{"tf":1.0}}}}}}}},"f":{"3":{"2":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{")":{".":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"(":{"1":{"0":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"[":{"df":0,"docs":{},"i":{"df":1,"docs":{"24":{"tf":1.0}}}},"_":{"df":0,"docs":{},"u":{"1":{"2":{"8":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"85":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"85":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"85":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"4":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"85":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"85":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"{":{"0":{"df":1,"docs":{"20":{"tf":1.0}}},"1":{"df":1,"docs":{"20":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"20":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":1,"docs":{"20":{"tf":1.7320508075688772}}}}},"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"52":{"tf":1.0},"81":{"tf":1.0}}}},"l":{"df":0,"docs":{},"s":{"df":2,"docs":{"101":{"tf":1.0},"84":{"tf":1.0}}}}},"df":2,"docs":{"17":{"tf":1.4142135623730951},"85":{"tf":2.8284271247461903}},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":5,"docs":{"121":{"tf":2.23606797749979},"18":{"tf":1.0},"23":{"tf":1.0},"47":{"tf":1.0},"78":{"tf":1.0}},"e":{"(":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":3,"docs":{"78":{"tf":1.0},"79":{"tf":1.0},"81":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"61":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":7,"docs":{"18":{"tf":1.0},"47":{"tf":1.0},"48":{"tf":1.0},"49":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"d":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":3,"docs":{"11":{"tf":1.0},"38":{"tf":1.0},"99":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"60":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"5":{"tf":1.0}}}}}},"i":{"b":{"(":{"1":{"0":{"0":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":1,"docs":{"8":{"tf":1.7320508075688772}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"(":{"1":{"0":{"df":4,"docs":{"21":{"tf":2.0},"22":{"tf":2.0},"23":{"tf":1.7320508075688772},"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"_":{"1":{"0":{"0":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"21":{"tf":2.0},"22":{"tf":2.23606797749979},"23":{"tf":2.8284271247461903},"24":{"tf":1.0}},"o":{"df":0,"docs":{},"n":{"a":{"c":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"20":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":1,"docs":{"106":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"106":{"tf":1.0}},"e":{":":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"106":{"tf":1.0},"107":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"106":{"tf":1.4142135623730951}}},"y":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"i":{"df":1,"docs":{"106":{"tf":1.4142135623730951}},"s":{":":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":3,"docs":{"106":{"tf":2.0},"107":{"tf":2.0},"117":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"101":{"tf":1.0}}}},"d":{"df":2,"docs":{"23":{"tf":2.0},"54":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":1,"docs":{"41":{"tf":1.0}}}},"r":{"df":1,"docs":{"83":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"41":{"tf":1.0},"88":{"tf":2.0}}}}}},"n":{"df":73,"docs":{"10":{"tf":1.7320508075688772},"101":{"tf":1.0},"102":{"tf":1.0},"104":{"tf":2.0},"106":{"tf":1.0},"107":{"tf":1.0},"11":{"tf":1.4142135623730951},"111":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.4142135623730951},"115":{"tf":1.7320508075688772},"116":{"tf":1.0},"117":{"tf":1.0},"120":{"tf":1.0},"15":{"tf":2.0},"17":{"tf":1.7320508075688772},"21":{"tf":2.0},"22":{"tf":2.8284271247461903},"23":{"tf":4.47213595499958},"24":{"tf":2.6457513110645907},"28":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"38":{"tf":2.0},"40":{"tf":1.0},"41":{"tf":2.0},"43":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951},"49":{"tf":1.0},"5":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"55":{"tf":1.4142135623730951},"57":{"tf":3.1622776601683795},"58":{"tf":1.4142135623730951},"60":{"tf":1.0},"61":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.4142135623730951},"67":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.7320508075688772},"70":{"tf":1.7320508075688772},"75":{"tf":1.0},"76":{"tf":1.4142135623730951},"77":{"tf":1.0},"79":{"tf":1.0},"8":{"tf":1.7320508075688772},"81":{"tf":1.4142135623730951},"83":{"tf":1.4142135623730951},"84":{"tf":1.0},"85":{"tf":3.1622776601683795},"86":{"tf":1.7320508075688772},"88":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.7320508075688772},"93":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.7320508075688772},"97":{"tf":1.0},"98":{"tf":1.0},"99":{"tf":1.7320508075688772}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"u":{"3":{"2":{"df":1,"docs":{"37":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"22":{"tf":1.0},"44":{"tf":1.0},"57":{"tf":1.4142135623730951}}}}}},"o":{"!":{"(":{"@":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"86":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"114":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"81":{"tf":1.0}}}}}},"df":0,"docs":{}},"(":{"_":{"df":1,"docs":{"10":{"tf":1.0}}},"b":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"104":{"tf":1.0},"34":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},":":{":":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"40":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"81":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":18,"docs":{"10":{"tf":2.8284271247461903},"106":{"tf":1.7320508075688772},"107":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.4142135623730951},"38":{"tf":2.23606797749979},"41":{"tf":1.4142135623730951},"48":{"tf":2.449489742783178},"49":{"tf":1.4142135623730951},"5":{"tf":1.0},"55":{"tf":1.0},"81":{"tf":1.7320508075688772},"86":{"tf":2.449489742783178}},"、":{"'":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":0,"docs":{}}}},":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"d":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"、":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"<":{"_":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"8":{"tf":1.0}}}}},"df":0,"docs":{}},"df":2,"docs":{"104":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"23":{"tf":2.0},"54":{"tf":1.0},"57":{"tf":1.0}}},"df":0,"docs":{}},"r":{"!":{"(":{")":{"df":0,"docs":{},"、":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"15":{"tf":1.7320508075688772},"24":{"tf":2.23606797749979},"54":{"tf":2.23606797749979},"9":{"tf":2.449489742783178}}}}},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"126":{"tf":1.0},"16":{"tf":1.0},"27":{"tf":1.0}}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"$":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"121":{"tf":1.0}},"i":{"df":1,"docs":{"10":{"tf":1.0}}}}},"n":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"29":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"104":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":3,"docs":{"31":{"tf":1.0},"57":{"tf":1.0},"8":{"tf":1.0}}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"29":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"g":{":":{":":{"<":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{">":{":":{":":{"c":{"df":1,"docs":{"37":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"b":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"!":{"(":{"4":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"84":{"tf":1.0}}}}}},"t":{"df":2,"docs":{"24":{"tf":1.4142135623730951},"54":{"tf":1.4142135623730951}}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"115":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"d":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":2,"docs":{"23":{"tf":2.23606797749979},"24":{"tf":2.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":4,"docs":{"11":{"tf":1.0},"16":{"tf":1.0},"33":{"tf":1.0},"50":{"tf":1.0}}}},"p":{"df":3,"docs":{"38":{"tf":1.4142135623730951},"55":{"tf":1.7320508075688772},"57":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"1":{"df":1,"docs":{"117":{"tf":1.0}}},"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"55":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"55":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"117":{"tf":1.0},"55":{"tf":2.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"22":{"tf":1.0},"5":{"tf":1.0}}}}},"i":{"df":2,"docs":{"70":{"tf":2.0},"88":{"tf":2.0}},"t":{"df":1,"docs":{"41":{"tf":1.0}}}},"o":{"df":1,"docs":{"84":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"34":{"tf":1.0}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"!":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"5":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":1,"docs":{"83":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"123":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":4,"docs":{"10":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.7320508075688772},"81":{"tf":1.7320508075688772}}}}}}}},"i":{"2":{":":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"17":{"tf":1.4142135623730951},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"17":{"tf":2.0},"45":{"tf":1.0}}},"3":{"2":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"104":{"tf":1.4142135623730951},"106":{"tf":1.4142135623730951}}},"df":0,"docs":{}},":":{"df":0,"docs":{},"i":{"d":{"df":5,"docs":{"17":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"57":{"tf":2.23606797749979}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"93":{"tf":1.0}}}}}}},"c":{"df":0,"docs":{},"y":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"30":{"tf":1.0},"41":{"tf":2.0}}},"df":0,"docs":{}}},"df":17,"docs":{"104":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":2.0},"27":{"tf":1.0},"30":{"tf":2.23606797749979},"32":{"tf":1.0},"41":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"46":{"tf":1.0},"49":{"tf":1.7320508075688772},"52":{"tf":1.0},"56":{"tf":1.7320508075688772},"81":{"tf":1.0},"83":{"tf":1.0},"98":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":8,"docs":{"16":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0},"46":{"tf":1.4142135623730951},"5":{"tf":1.0},"57":{"tf":1.4142135623730951},"63":{"tf":1.0},"8":{"tf":1.0}}}}},"s":{":":{":":{"_":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"98":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"98":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"、":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"27":{"tf":1.0}}}}}}}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"、":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"44":{"tf":1.0}}}}}},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"$":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"18":{"tf":1.0},"47":{"tf":1.0},"52":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"<":{"'":{"a":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"120":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"23":{"tf":2.23606797749979},"24":{"tf":1.4142135623730951},"31":{"tf":1.0},"40":{"tf":1.0},"57":{"tf":2.0},"58":{"tf":1.0},"8":{"tf":1.0},"81":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"63":{"tf":1.0}}}}}}},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"84":{"tf":1.4142135623730951}}}}}}}}},"d":{":":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"24":{"tf":2.0},"7":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"(":{"0":{"df":2,"docs":{"18":{"tf":1.0},"50":{"tf":1.4142135623730951}}},"1":{"df":3,"docs":{"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"18":{"tf":1.0},"47":{"tf":1.0},"50":{"tf":2.0}}}}}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"22":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"<":{"'":{"b":{">":{"(":{"&":{"'":{"b":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}},"df":8,"docs":{"18":{"tf":1.0},"22":{"tf":3.0},"23":{"tf":3.4641016151377544},"24":{"tf":2.449489742783178},"50":{"tf":1.4142135623730951},"51":{"tf":1.0},"52":{"tf":1.0},"7":{"tf":1.0}},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"<":{"'":{"a":{"df":3,"docs":{"22":{"tf":2.449489742783178},"23":{"tf":2.8284271247461903},"24":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"22":{"tf":2.0},"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951}},"{":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}},"i":{"c":{"df":1,"docs":{"50":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"117":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":2,"docs":{"84":{"tf":1.0},"88":{"tf":1.0}}}}}}},"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"!":{"(":{"@":{"a":{"c":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"88":{"tf":3.7416573867739413}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"[":{"0":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"88":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"88":{"tf":4.47213595499958}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":7,"docs":{"21":{"tf":2.0},"22":{"tf":1.4142135623730951},"23":{"tf":2.449489742783178},"24":{"tf":1.4142135623730951},"84":{"tf":1.0},"88":{"tf":1.0},"9":{"tf":1.4142135623730951}},"i":{"df":2,"docs":{"11":{"tf":1.4142135623730951},"9":{"tf":1.0}}},"s":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":5,"docs":{"21":{"tf":4.123105625617661},"22":{"tf":2.0},"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"104":{"tf":1.0},"21":{"tf":1.7320508075688772},"22":{"tf":1.4142135623730951},"23":{"tf":2.0},"24":{"tf":1.4142135623730951},"46":{"tf":2.0}},"e":{"(":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"y":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{"df":0,"docs":{},"i":{"d":{"df":4,"docs":{"49":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0}}},"df":0,"docs":{}}},"df":3,"docs":{"49":{"tf":2.449489742783178},"51":{"tf":1.0},"55":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":7,"docs":{"107":{"tf":1.4142135623730951},"110":{"tf":1.0},"112":{"tf":1.0},"114":{"tf":1.4142135623730951},"21":{"tf":1.4142135623730951},"88":{"tf":1.0},"91":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"27":{"tf":1.0},"39":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"df":1,"docs":{"16":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"86":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"40":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"v":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"57":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":4,"docs":{"0":{"tf":1.4142135623730951},"18":{"tf":1.0},"47":{"tf":1.0},"78":{"tf":1.0}}}}},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"41":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"31":{"tf":1.0}}}}}}},"df":14,"docs":{"103":{"tf":1.7320508075688772},"14":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"23":{"tf":2.23606797749979},"24":{"tf":1.4142135623730951},"27":{"tf":1.0},"31":{"tf":3.1622776601683795},"38":{"tf":1.7320508075688772},"55":{"tf":1.4142135623730951},"77":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.0}},"、":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"21":{"tf":1.0}}}}}}}},"r":{"df":6,"docs":{"20":{"tf":1.4142135623730951},"21":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"23":{"tf":2.8284271247461903},"24":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951}}}}}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"91":{"tf":1.0}}}}}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}},"y":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":4,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"5":{"tf":1.0},"57":{"tf":2.23606797749979}}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"83":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"83":{"tf":1.7320508075688772}}}}}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"32":{"tf":1.0},"54":{"tf":1.0}}}}},"c":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"5":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"83":{"tf":2.449489742783178}}}},"df":0,"docs":{}},"z":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"8":{"tf":1.0}}},"k":{"df":1,"docs":{"66":{"tf":1.0}}}},"df":0,"docs":{},"n":{"(":{"&":{"[":{"$":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"c":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"!":{"(":{"$":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"97":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":1,"docs":{"51":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"51":{"tf":1.0},"97":{"tf":1.0}},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"(":{"0":{"df":2,"docs":{"18":{"tf":1.0},"51":{"tf":1.0}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"18":{"tf":1.0},"47":{"tf":1.0},"51":{"tf":2.0}}}}}}},"df":0,"docs":{}},"df":3,"docs":{"18":{"tf":1.0},"51":{"tf":1.0},"97":{"tf":1.0}}}}}},"t":{"'":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{},"s":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"51":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":1.0}}}}},"x":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.4142135623730951}}}}}},"h":{"df":3,"docs":{"6":{"tf":1.0},"7":{"tf":2.0},"9":{"tf":1.7320508075688772}}},"i":{"b":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"109":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":4,"docs":{"109":{"tf":1.0},"25":{"tf":1.7320508075688772},"62":{"tf":1.7320508075688772},"76":{"tf":1.4142135623730951}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"2":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":5,"docs":{"16":{"tf":1.0},"27":{"tf":1.0},"32":{"tf":2.6457513110645907},"41":{"tf":1.0},"46":{"tf":1.0}},"e":{":":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"32":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"104":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{":":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":9,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"22":{"tf":1.0},"27":{"tf":1.0},"29":{"tf":1.0},"33":{"tf":2.449489742783178},"35":{"tf":1.0},"36":{"tf":1.0},"5":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"9":{"tf":2.0}}}}},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"o":{"c":{"a":{"df":0,"docs":{},"l":{"df":6,"docs":{"10":{"tf":3.605551275463989},"120":{"tf":2.0},"22":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0},"54":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"x":{"!":{"(":{"$":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"61":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"61":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"84":{"tf":1.0}}}}}}}}}}},"u":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"62":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"m":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"46":{"tf":1.0}}},"df":0,"docs":{}}}}},"a":{"c":{"df":3,"docs":{"25":{"tf":1.4142135623730951},"69":{"tf":1.4142135623730951},"76":{"tf":2.6457513110645907}},"r":{"df":0,"docs":{},"o":{"2":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"119":{"tf":2.0},"120":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"119":{"tf":2.6457513110645907},"121":{"tf":1.0}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":6,"docs":{"25":{"tf":1.7320508075688772},"55":{"tf":1.7320508075688772},"72":{"tf":1.0},"76":{"tf":2.23606797749979},"80":{"tf":1.0},"86":{"tf":2.0}}}}}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"62":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":76,"docs":{"10":{"tf":2.0},"101":{"tf":2.0},"102":{"tf":1.0},"104":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":1.0},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"14":{"tf":2.6457513110645907},"15":{"tf":1.7320508075688772},"16":{"tf":2.23606797749979},"17":{"tf":1.7320508075688772},"21":{"tf":1.7320508075688772},"22":{"tf":2.449489742783178},"23":{"tf":3.605551275463989},"24":{"tf":2.6457513110645907},"25":{"tf":1.7320508075688772},"26":{"tf":1.0},"28":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"38":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":2.23606797749979},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":2.0},"48":{"tf":2.0},"49":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"54":{"tf":1.4142135623730951},"55":{"tf":1.7320508075688772},"57":{"tf":2.449489742783178},"58":{"tf":1.4142135623730951},"60":{"tf":1.0},"61":{"tf":1.0},"62":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.4142135623730951},"67":{"tf":1.4142135623730951},"68":{"tf":2.0},"69":{"tf":2.0},"70":{"tf":2.0},"72":{"tf":1.0},"73":{"tf":1.0},"75":{"tf":1.4142135623730951},"76":{"tf":1.7320508075688772},"77":{"tf":1.4142135623730951},"78":{"tf":1.0},"79":{"tf":2.0},"8":{"tf":2.449489742783178},"80":{"tf":1.0},"81":{"tf":2.0},"83":{"tf":2.0},"84":{"tf":1.7320508075688772},"85":{"tf":1.4142135623730951},"86":{"tf":2.23606797749979},"88":{"tf":1.7320508075688772},"90":{"tf":1.7320508075688772},"91":{"tf":1.0},"93":{"tf":2.23606797749979},"95":{"tf":1.4142135623730951},"96":{"tf":2.23606797749979},"97":{"tf":1.4142135623730951},"98":{"tf":1.0},"99":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"s":{"df":10,"docs":{"11":{"tf":1.0},"23":{"tf":1.0},"38":{"tf":1.0},"69":{"tf":2.6457513110645907},"70":{"tf":1.0},"71":{"tf":1.0},"75":{"tf":2.0},"76":{"tf":2.0},"77":{"tf":1.4142135623730951},"99":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"76":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":29,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"104":{"tf":1.0},"106":{"tf":1.0},"109":{"tf":2.449489742783178},"117":{"tf":1.0},"119":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"121":{"tf":1.0},"125":{"tf":1.0},"18":{"tf":1.0},"22":{"tf":1.0},"3":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"5":{"tf":1.4142135623730951},"57":{"tf":1.7320508075688772},"58":{"tf":1.4142135623730951},"60":{"tf":1.4142135623730951},"75":{"tf":1.0},"76":{"tf":1.4142135623730951},"78":{"tf":1.4142135623730951},"79":{"tf":2.8284271247461903},"8":{"tf":1.7320508075688772},"80":{"tf":2.449489742783178},"81":{"tf":2.449489742783178},"88":{"tf":1.0},"9":{"tf":1.0},"99":{"tf":1.0}}}},"s":{":":{":":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"76":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"22":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":63,"docs":{"10":{"tf":1.4142135623730951},"101":{"tf":1.0},"102":{"tf":1.0},"104":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":1.0},"11":{"tf":1.4142135623730951},"17":{"tf":1.7320508075688772},"21":{"tf":1.4142135623730951},"22":{"tf":1.7320508075688772},"23":{"tf":3.3166247903554},"24":{"tf":1.7320508075688772},"25":{"tf":1.0},"28":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"38":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":2.0},"43":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951},"49":{"tf":1.0},"5":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"57":{"tf":2.23606797749979},"58":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.4142135623730951},"67":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.7320508075688772},"70":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":1.4142135623730951},"77":{"tf":1.0},"79":{"tf":1.0},"8":{"tf":1.4142135623730951},"81":{"tf":1.0},"83":{"tf":1.4142135623730951},"84":{"tf":1.0},"86":{"tf":1.7320508075688772},"88":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"93":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.7320508075688772},"97":{"tf":1.0},"98":{"tf":1.0},"99":{"tf":1.7320508075688772}}}},"k":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"10":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"!":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"57":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"57":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"!":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"57":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"57":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"91":{"tf":1.0}}},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"114":{"tf":1.0}}}}},"n":{"a":{"df":1,"docs":{"114":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":1,"docs":{"51":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}},"s":{"!":{"(":{"$":{"df":1,"docs":{"46":{"tf":1.0}}},"(":{"c":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"df":1,"docs":{"46":{"tf":1.0}}},"5":{"df":1,"docs":{"46":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":8,"docs":{"11":{"tf":1.0},"23":{"tf":2.23606797749979},"41":{"tf":1.0},"48":{"tf":1.0},"5":{"tf":1.0},"68":{"tf":1.7320508075688772},"8":{"tf":1.4142135623730951},"86":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"103":{"tf":1.0},"14":{"tf":2.0},"15":{"tf":2.449489742783178},"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"79":{"tf":1.0}}}}}},"df":0,"docs":{}},"y":{"b":{"df":1,"docs":{"83":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"b":{"df":0,"docs":{},"e":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}},"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":4,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"123":{"tf":1.4142135623730951},"38":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":3,"docs":{"101":{"tf":1.4142135623730951},"12":{"tf":1.0},"14":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":3,"docs":{"23":{"tf":3.4641016151377544},"24":{"tf":2.8284271247461903},"25":{"tf":1.0}}}}}},"df":4,"docs":{"21":{"tf":2.23606797749979},"22":{"tf":2.23606797749979},"23":{"tf":3.0},"24":{"tf":2.0}}},"t":{"a":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"df":4,"docs":{"104":{"tf":1.0},"106":{"tf":1.7320508075688772},"107":{"tf":1.0},"34":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}},"df":6,"docs":{"104":{"tf":1.0},"106":{"tf":1.7320508075688772},"16":{"tf":1.0},"17":{"tf":1.0},"27":{"tf":1.0},"34":{"tf":2.23606797749979}},"v":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"126":{"tf":1.0},"16":{"tf":1.4142135623730951},"18":{"tf":1.0},"27":{"tf":1.0},"52":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"105":{"tf":1.0},"57":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"83":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"41":{"tf":1.0}}}},"t":{"df":1,"docs":{"2":{"tf":1.0}}},"x":{"df":3,"docs":{"122":{"tf":1.0},"54":{"tf":1.0},"81":{"tf":1.0}},"e":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"84":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"!":{"(":{"$":{"(":{"$":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"84":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"d":{"df":9,"docs":{"55":{"tf":1.0},"65":{"tf":1.7320508075688772},"66":{"tf":2.449489742783178},"67":{"tf":1.7320508075688772},"68":{"tf":1.0},"69":{"tf":3.0},"71":{"tf":1.7320508075688772},"75":{"tf":1.0},"76":{"tf":1.0}},"u":{"df":0,"docs":{},"l":{"df":2,"docs":{"31":{"tf":1.0},"57":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"70":{"tf":1.4142135623730951}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":2,"docs":{"101":{"tf":2.23606797749979},"102":{"tf":2.0}}}}},"df":0,"docs":{}}}}},"u":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"91":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":1,"docs":{"9":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":3,"docs":{"22":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0}},"y":{"_":{"a":{"d":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"n":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"39":{"tf":1.0},"84":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"0":{"df":1,"docs":{"57":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":1,"docs":{"57":{"tf":1.4142135623730951}}}}}}},"df":8,"docs":{"10":{"tf":1.0},"17":{"tf":1.0},"22":{"tf":2.449489742783178},"23":{"tf":3.1622776601683795},"24":{"tf":2.0},"35":{"tf":1.0},"36":{"tf":1.0},"57":{"tf":2.6457513110645907}}}},"y":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"113":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"88":{"tf":1.7320508075688772}}}}},"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"112":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"111":{"tf":1.0}}}}}}}},":":{"df":0,"docs":{},"i":{"d":{"df":4,"docs":{"104":{"tf":1.0},"106":{"tf":1.7320508075688772},"107":{"tf":1.0},"84":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":12,"docs":{"104":{"tf":1.0},"106":{"tf":2.0},"107":{"tf":1.0},"120":{"tf":1.7320508075688772},"14":{"tf":1.0},"16":{"tf":1.0},"57":{"tf":1.0},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"81":{"tf":2.23606797749979},"84":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}},"!":{"$":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"110":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"df":8,"docs":{"101":{"tf":2.449489742783178},"102":{"tf":1.0},"11":{"tf":1.0},"21":{"tf":2.449489742783178},"22":{"tf":2.6457513110645907},"23":{"tf":3.3166247903554},"88":{"tf":1.7320508075688772},"97":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"w":{"df":2,"docs":{"22":{"tf":1.0},"81":{"tf":1.0}}},"x":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"21":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"21":{"tf":2.23606797749979},"22":{"tf":2.6457513110645907},"23":{"tf":3.4641016151377544},"24":{"tf":2.449489742783178}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"106":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":7,"docs":{"11":{"tf":1.0},"23":{"tf":1.4142135623730951},"38":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"88":{"tf":1.0},"99":{"tf":1.0}}}}}}}},"o":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":2,"docs":{"46":{"tf":2.0},"8":{"tf":1.0}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"d":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"98":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":1,"docs":{"41":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":2,"docs":{"22":{"tf":1.0},"8":{"tf":1.0}},"e":{"df":2,"docs":{"51":{"tf":1.0},"91":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":5,"docs":{"38":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":3.3166247903554},"88":{"tf":3.605551275463989},"99":{"tf":3.3166247903554}}},"h":{"df":1,"docs":{"14":{"tf":1.0}}}},"w":{"df":1,"docs":{"91":{"tf":1.0}}}},"t":{"df":3,"docs":{"22":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"98":{"tf":1.0}}}}}},"{":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"{":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"o":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"n":{"df":1,"docs":{"99":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"df":1,"docs":{"99":{"tf":1.0}}}},"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"df":0,"docs":{},"o":{"df":1,"docs":{"30":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"d":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":2,"docs":{"79":{"tf":1.4142135623730951},"99":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":3,"docs":{"22":{"tf":3.4641016151377544},"23":{"tf":4.0},"24":{"tf":2.8284271247461903}}}}}}},"g":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}},"h":{"df":1,"docs":{"84":{"tf":1.7320508075688772}}},"n":{"df":3,"docs":{"51":{"tf":1.0},"52":{"tf":1.7320508075688772},"70":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"27":{"tf":1.0}}}}},"df":4,"docs":{"18":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":2.0},"9":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"99":{"tf":1.0}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"41":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"<":{"$":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"23":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"21":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"6":{"4":{"df":3,"docs":{"21":{"tf":1.0},"22":{"tf":1.4142135623730951},"23":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":1,"docs":{"91":{"tf":1.4142135623730951}}}}},"df":5,"docs":{"22":{"tf":1.4142135623730951},"23":{"tf":1.4142135623730951},"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":2,"docs":{"46":{"tf":1.0},"83":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"49":{"tf":1.0},"51":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"49":{"tf":2.449489742783178},"51":{"tf":1.0}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951},"88":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"91":{"tf":1.0}}}}}},"p":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"93":{"tf":1.0}}}},"df":0,"docs":{}}},"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"43":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"57":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}},"s":{"df":5,"docs":{"121":{"tf":1.7320508075688772},"22":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0},"6":{"tf":1.7320508075688772}},"e":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"121":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":1,"docs":{"8":{"tf":1.0}}}}},"t":{"df":1,"docs":{"91":{"tf":1.0}},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"54":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"22":{"tf":1.0}}}},"t":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":2,"docs":{"35":{"tf":1.0},"36":{"tf":1.0}}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"]":{"df":0,"docs":{},":":{"=":{">":{"df":0,"docs":{},"、":{",":{"df":0,"docs":{},"、":{"=":{"df":0,"docs":{},"、":{"df":0,"docs":{},"|":{"df":0,"docs":{},"、":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"、":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"44":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"27":{"tf":1.0},"36":{"tf":2.449489742783178}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":7,"docs":{"104":{"tf":1.4142135623730951},"16":{"tf":1.0},"27":{"tf":1.0},"35":{"tf":1.7320508075688772},"36":{"tf":2.0},"44":{"tf":1.0},"56":{"tf":1.0}},"h":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"37":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":8,"docs":{"16":{"tf":1.0},"27":{"tf":1.0},"34":{"tf":1.0},"37":{"tf":2.23606797749979},"44":{"tf":1.4142135623730951},"63":{"tf":1.4142135623730951},"80":{"tf":1.0},"91":{"tf":1.0}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":5,"docs":{"16":{"tf":1.0},"35":{"tf":2.0},"36":{"tf":2.6457513110645907},"57":{"tf":1.0},"8":{"tf":1.0}},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"35":{"tf":1.0},"36":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":1,"docs":{"93":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"83":{"tf":1.4142135623730951}}}}},"l":{"a":{"df":0,"docs":{},"y":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"11":{"tf":1.0},"38":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":1,"docs":{"60":{"tf":2.6457513110645907}}}}},"o":{"df":4,"docs":{"21":{"tf":2.23606797749979},"22":{"tf":2.0},"23":{"tf":3.0},"24":{"tf":2.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"107":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"21":{"tf":1.0},"22":{"tf":1.0}}}}}},"r":{"df":1,"docs":{"0":{"tf":1.0}},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"57":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":4,"docs":{"11":{"tf":1.0},"23":{"tf":1.0},"38":{"tf":1.0},"99":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":3,"docs":{"115":{"tf":1.0},"23":{"tf":1.4142135623730951},"24":{"tf":1.0}}},"y":{"=":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}},"f":{"(":{"\"":{"df":0,"docs":{},"o":{"df":0,"docs":{},"h":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"n":{"!":{"(":{"\"":{"#":{"1":{"df":1,"docs":{"83":{"tf":1.0}}},"2":{"df":1,"docs":{"83":{"tf":1.0}}},"3":{"df":1,"docs":{"83":{"tf":1.0}}},"4":{"df":1,"docs":{"83":{"tf":1.0}}},"5":{"df":1,"docs":{"83":{"tf":1.0}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":1,"docs":{"49":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"49":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":2,"docs":{"11":{"tf":1.0},"8":{"tf":1.0}}}}}},"i":{"df":1,"docs":{"8":{"tf":1.0}}}},"i":{"df":1,"docs":{"83":{"tf":1.0}}},"p":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"91":{"tf":1.0}}}}},"df":0,"docs":{}},"{":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"v":{"df":1,"docs":{"50":{"tf":1.0}}},"}":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"{":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}},"{":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"计":{"df":0,"docs":{},"数":{"df":0,"docs":{},"结":{"df":0,"docs":{},"果":{"df":0,"docs":{},":":{"df":0,"docs":{},"{":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"102":{"tf":2.23606797749979}}}},"df":0,"docs":{}}}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"y":{"!":{"(":{"$":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"84":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":14,"docs":{"102":{"tf":2.0},"21":{"tf":2.0},"22":{"tf":2.0},"23":{"tf":2.0},"24":{"tf":1.4142135623730951},"41":{"tf":1.0},"46":{"tf":1.0},"51":{"tf":1.0},"57":{"tf":2.449489742783178},"58":{"tf":1.0},"8":{"tf":1.0},"83":{"tf":1.4142135623730951},"88":{"tf":1.0},"97":{"tf":1.0}}}}}},"v":{"df":1,"docs":{"44":{"tf":1.0}}}},"o":{"c":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"2":{"df":1,"docs":{"120":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":5,"docs":{"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0},"119":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"_":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"112":{"tf":1.0},"115":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"116":{"tf":1.0},"117":{"tf":1.0}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"l":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"116":{"tf":1.0},"117":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":7,"docs":{"109":{"tf":1.4142135623730951},"111":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":2.6457513110645907},"121":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":7,"docs":{"10":{"tf":1.0},"104":{"tf":1.0},"109":{"tf":2.23606797749979},"119":{"tf":3.605551275463989},"120":{"tf":1.0},"121":{"tf":1.4142135623730951},"8":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"8":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"107":{"tf":1.7320508075688772},"84":{"tf":1.0}}}}}},"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"88":{"tf":1.0}}}},"df":0,"docs":{}}}}},"u":{"b":{"(":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"106":{"tf":1.7320508075688772},"107":{"tf":1.7320508075688772},"41":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"41":{"tf":1.4142135623730951}}}}},"_":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"41":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":12,"docs":{"104":{"tf":1.0},"106":{"tf":1.4142135623730951},"111":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0},"41":{"tf":2.449489742783178},"55":{"tf":1.4142135623730951},"81":{"tf":1.4142135623730951}},"、":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"(":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{")":{"df":0,"docs":{},"、":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"80":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"39":{"tf":1.0},"88":{"tf":1.0}}}},"t":{"df":1,"docs":{"84":{"tf":1.0}}}},"y":{"df":1,"docs":{"123":{"tf":1.0}}}},"q":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"60":{"tf":1.0}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"41":{"tf":1.0},"63":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"114":{"tf":1.0}}}},"df":0,"docs":{},"z":{"df":2,"docs":{"27":{"tf":1.0},"54":{"tf":1.0}}}},"o":{"df":0,"docs":{},"t":{"df":3,"docs":{"113":{"tf":1.0},"120":{"tf":2.6457513110645907},"85":{"tf":1.0}}}},"u":{"df":0,"docs":{},"x":{"df":1,"docs":{"60":{"tf":1.0}}}},"x":{"df":1,"docs":{"106":{"tf":1.4142135623730951}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"57":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"83":{"tf":2.0}},"e":{"!":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"83":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"r":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":5,"docs":{"21":{"tf":4.242640687119285},"22":{"tf":2.0},"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}}}}}},"df":3,"docs":{"21":{"tf":1.7320508075688772},"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951}},"r":{"df":6,"docs":{"20":{"tf":1.0},"21":{"tf":3.1622776601683795},"22":{"tf":3.1622776601683795},"23":{"tf":4.0},"24":{"tf":3.0},"25":{"tf":2.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"!":{"(":{"df":0,"docs":{},"f":{"[":{"df":0,"docs":{},"i":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":0,"docs":{}}},"[":{"a":{"[":{"df":0,"docs":{},"n":{"df":4,"docs":{"21":{"tf":1.4142135623730951},"22":{"tf":2.0},"23":{"tf":2.6457513110645907},"24":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"df":0,"docs":{},"r":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"23":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"s":{"df":3,"docs":{"41":{"tf":1.0},"91":{"tf":1.0},"96":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"85":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}}},"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"99":{"tf":1.0}}}}},"df":1,"docs":{"8":{"tf":1.0}},"u":{"df":0,"docs":{},"x":{"df":1,"docs":{"16":{"tf":1.0}}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"83":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":1,"docs":{"104":{"tf":1.0}},"f":{"df":3,"docs":{"35":{"tf":1.0},"36":{"tf":1.0},"8":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":9,"docs":{"103":{"tf":1.0},"108":{"tf":1.0},"117":{"tf":1.0},"12":{"tf":1.0},"18":{"tf":1.0},"27":{"tf":1.0},"38":{"tf":1.0},"44":{"tf":1.0},"63":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"91":{"tf":1.0}}}}}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"38":{"tf":1.4142135623730951},"57":{"tf":1.0}}}}},"p":{"df":1,"docs":{"17":{"tf":1.7320508075688772}},"e":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"17":{"tf":2.0}}}}}},"df":4,"docs":{"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951},"49":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":5,"docs":{"17":{"tf":1.0},"49":{"tf":1.7320508075688772},"50":{"tf":1.0},"90":{"tf":1.0},"95":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}}}},"l":{"a":{"c":{"df":2,"docs":{"90":{"tf":1.0},"95":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"!":{"(":{"$":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":2,"docs":{"95":{"tf":1.0},"96":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"(":{"$":{"_":{"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"79":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":1,"docs":{"79":{"tf":1.0}}},"df":4,"docs":{"90":{"tf":1.7320508075688772},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":1,"docs":{"123":{"tf":2.0}}}},"s":{"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":2,"docs":{"60":{"tf":1.0},"61":{"tf":1.0}}}}},"df":1,"docs":{"107":{"tf":2.23606797749979}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"44":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"101":{"tf":1.0},"23":{"tf":2.0}}}}}},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"104":{"tf":1.0}}},"y":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"104":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"104":{"tf":1.0},"91":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"92":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"f":{"c":{"df":3,"docs":{"18":{"tf":1.0},"47":{"tf":1.0},"78":{"tf":1.0}},"s":{"#":{"1":{"5":{"8":{"4":{"df":3,"docs":{"18":{"tf":1.0},"47":{"tf":1.0},"78":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"h":{"df":3,"docs":{"6":{"tf":1.0},"7":{"tf":2.0},"9":{"tf":1.7320508075688772}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"0":{"df":1,"docs":{"14":{"tf":1.0}}},"1":{"df":1,"docs":{"14":{"tf":1.0}}},"df":4,"docs":{"58":{"tf":1.4142135623730951},"68":{"tf":1.7320508075688772},"86":{"tf":1.0},"91":{"tf":1.4142135623730951}},"n":{"df":1,"docs":{"14":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"#":{"3":{"9":{"4":{"1":{"2":{"df":1,"docs":{"78":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"3":{"5":{"2":{"7":{"df":2,"docs":{"18":{"tf":1.0},"47":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"5":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":9,"docs":{"11":{"tf":2.0},"22":{"tf":1.0},"23":{"tf":2.0},"38":{"tf":1.0},"60":{"tf":1.0},"86":{"tf":1.0},"88":{"tf":1.0},"96":{"tf":1.0},"99":{"tf":1.0}}},"df":46,"docs":{"0":{"tf":3.3166247903554},"10":{"tf":1.4142135623730951},"101":{"tf":1.0},"103":{"tf":2.0},"108":{"tf":1.4142135623730951},"109":{"tf":1.7320508075688772},"114":{"tf":1.0},"12":{"tf":1.4142135623730951},"120":{"tf":1.4142135623730951},"121":{"tf":2.449489742783178},"123":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"20":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"27":{"tf":1.4142135623730951},"29":{"tf":1.0},"3":{"tf":1.7320508075688772},"31":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":1.0},"44":{"tf":1.0},"47":{"tf":1.0},"5":{"tf":2.23606797749979},"54":{"tf":1.7320508075688772},"57":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"62":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"77":{"tf":1.0},"8":{"tf":2.8284271247461903},"83":{"tf":1.0},"86":{"tf":1.4142135623730951},"88":{"tf":1.7320508075688772},"90":{"tf":1.0},"93":{"tf":1.0}},",":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"44":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"y":{"df":0,"docs":{},"m":{"df":1,"docs":{"1":{"tf":1.0}}}}},"s":{"!":{"(":{"\"":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":1,"docs":{"93":{"tf":1.0}}}}}}},"a":{"df":1,"docs":{"2":{"tf":1.0}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":3,"docs":{"23":{"tf":2.8284271247461903},"54":{"tf":1.4142135623730951},"63":{"tf":1.7320508075688772}}}},"t":{"df":1,"docs":{"83":{"tf":1.0}}}}},"df":4,"docs":{"11":{"tf":1.4142135623730951},"17":{"tf":1.0},"91":{"tf":1.0},"93":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"0":{"df":1,"docs":{"57":{"tf":1.7320508075688772}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"21":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"21":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"[":{"df":0,"docs":{},"i":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":4,"docs":{"21":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}},"df":3,"docs":{"22":{"tf":2.23606797749979},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}},"p":{"df":0,"docs":{},"o":{"df":4,"docs":{"21":{"tf":2.8284271247461903},"22":{"tf":2.8284271247461903},"23":{"tf":4.0},"24":{"tf":2.8284271247461903}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"[":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{".":{"0":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"_":{":":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"57":{"tf":1.0},"58":{"tf":1.0}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"58":{"tf":1.0}}}},"df":0,"docs":{}}},"df":1,"docs":{"57":{"tf":1.0}}},"df":10,"docs":{"105":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":2.23606797749979},"23":{"tf":2.8284271247461903},"24":{"tf":2.0},"5":{"tf":1.7320508075688772},"56":{"tf":1.0},"57":{"tf":5.196152422706632},"58":{"tf":1.4142135623730951},"91":{"tf":1.0}}}},"m":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"38":{"tf":2.0}}}}}}},"df":0,"docs":{}}},"p":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"q":{":":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"24":{"tf":1.4142135623730951}}},"t":{"df":1,"docs":{"44":{"tf":1.0}}}},"h":{"a":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"68":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"32":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"w":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"(":{"df":1,"docs":{"91":{"tf":1.0}}},"df":1,"docs":{"91":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"!":{"(":{"$":{"(":{"$":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"61":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"61":{"tf":1.4142135623730951}},"l":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"e":{"df":2,"docs":{"122":{"tf":1.7320508075688772},"81":{"tf":1.4142135623730951}}}},"x":{"df":1,"docs":{"91":{"tf":1.0}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"91":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":4,"docs":{"22":{"tf":2.449489742783178},"23":{"tf":2.6457513110645907},"24":{"tf":2.0},"97":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"22":{"tf":1.0}}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"51":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":3,"docs":{"25":{"tf":1.4142135623730951},"92":{"tf":1.0},"96":{"tf":1.4142135623730951}}}}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"9":{"2":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"v":{"df":4,"docs":{"21":{"tf":2.0},"22":{"tf":2.0},"23":{"tf":2.8284271247461903},"24":{"tf":2.0}}}},"df":0,"docs":{}}}}},"s":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"91":{"tf":1.0}}}}}},"df":0,"docs":{}}},"_":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"77":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"!":{"(":{"\"":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"77":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"120":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"!":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"77":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"t":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"71":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"71":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"41":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"91":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"21":{"tf":1.4142135623730951},"46":{"tf":2.6457513110645907}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"120":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":3,"docs":{"109":{"tf":1.4142135623730951},"122":{"tf":3.1622776601683795},"53":{"tf":1.0}},"g":{"df":1,"docs":{"15":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":3,"docs":{"126":{"tf":1.0},"16":{"tf":1.0},"27":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"60":{"tf":1.0}}}}},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"0":{":":{"2":{"0":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{":":{"1":{"df":1,"docs":{"60":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{":":{"1":{"0":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}},"2":{"1":{"df":1,"docs":{"58":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{":":{"2":{"1":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"0":{":":{"3":{"1":{"df":1,"docs":{"88":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"2":{"4":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}},"3":{"3":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"8":{":":{"5":{"0":{"df":1,"docs":{"23":{"tf":1.0}}},"2":{"df":1,"docs":{"23":{"tf":1.0}}},"9":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}},"6":{"1":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"1":{"0":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"5":{":":{"4":{"5":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{":":{"5":{"df":1,"docs":{"99":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"84":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"16":{"tf":1.0},"21":{"tf":1.0},"38":{"tf":2.23606797749979},"54":{"tf":1.0},"8":{"tf":1.0}}}}}}},"i":{"c":{"df":5,"docs":{"106":{"tf":1.0},"23":{"tf":1.7320508075688772},"31":{"tf":1.0},"32":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}}}},"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{":":{":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"v":{"1":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"_":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"0":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{":":{":":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{":":{":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"v":{"1":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"11":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"(":{"0":{".":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"(":{"1":{"0":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"22":{"tf":2.0},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":4,"docs":{"22":{"tf":1.4142135623730951},"23":{"tf":2.0},"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"df":1,"docs":{"23":{"tf":1.0}},"i":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"2":{"0":{"1":{"8":{"df":3,"docs":{"11":{"tf":1.0},"38":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"v":{"1":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":4,"docs":{"11":{"tf":1.0},"23":{"tf":1.4142135623730951},"38":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":3,"docs":{"21":{"tf":1.0},"23":{"tf":4.123105625617661},"24":{"tf":3.1622776601683795}}},"m":{"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.0}}}}}}},"df":4,"docs":{"16":{"tf":1.0},"27":{"tf":1.0},"38":{"tf":3.0},"44":{"tf":1.0}}}},"r":{"df":3,"docs":{"106":{"tf":1.0},"23":{"tf":1.0},"91":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}}}}}},"$":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"106":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":5,"docs":{"104":{"tf":1.0},"106":{"tf":1.0},"11":{"tf":1.7320508075688772},"88":{"tf":2.0},"90":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"46":{"tf":1.4142135623730951}}},"y":{"!":{"(":{"$":{"(":{"$":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"102":{"tf":2.0}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"102":{"tf":2.0}}}}},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"46":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":1,"docs":{"57":{"tf":1.0}},"n":{"df":0,"docs":{},"n":{"df":2,"docs":{"50":{"tf":1.0},"51":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"51":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"u":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"106":{"tf":2.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":14,"docs":{"10":{"tf":1.0},"106":{"tf":3.4641016151377544},"116":{"tf":1.0},"117":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":2.23606797749979},"23":{"tf":3.0},"24":{"tf":2.0},"31":{"tf":1.4142135623730951},"38":{"tf":2.0},"57":{"tf":2.0},"58":{"tf":1.0},"8":{"tf":1.0},"81":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"9":{"tf":1.0}}}}}},"df":0,"docs":{}}},"y":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":5,"docs":{"21":{"tf":1.0},"22":{"tf":2.0},"23":{"tf":2.0},"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}}}},"df":0,"docs":{}}},"u":{"b":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":5,"docs":{"79":{"tf":1.4142135623730951},"90":{"tf":1.4142135623730951},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0}}}}}}},"df":6,"docs":{"5":{"tf":1.4142135623730951},"79":{"tf":1.4142135623730951},"90":{"tf":1.4142135623730951},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"46":{"tf":1.4142135623730951}}}}}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"81":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"41":{"tf":1.0}}}}}},"w":{"a":{"df":0,"docs":{},"p":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":3,"docs":{"22":{"tf":2.449489742783178},"23":{"tf":2.8284271247461903},"24":{"tf":2.0}}}}}},"df":1,"docs":{"22":{"tf":1.0}}}},"df":0,"docs":{}},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"df":2,"docs":{"121":{"tf":2.0},"14":{"tf":1.0}},"t":{"a":{"df":0,"docs":{},"x":{"df":5,"docs":{"3":{"tf":1.0},"48":{"tf":1.0},"54":{"tf":1.0},"6":{"tf":1.0},"62":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"93":{"tf":1.0}}}}},"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":2,"docs":{"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951}}}}}},"t":{"df":0,"docs":{},"t":{"df":3,"docs":{"84":{"tf":1.7320508075688772},"91":{"tf":1.7320508075688772},"96":{"tf":3.0}}}}},"df":1,"docs":{"91":{"tf":1.0}}}}},"df":2,"docs":{"61":{"tf":1.0},"93":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"91":{"tf":1.4142135623730951}}}}}},"x":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"63":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"9":{"tf":1.0}}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"1":{"tf":1.0}}},"i":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"1":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"51":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":2,"docs":{"52":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":4,"docs":{"114":{"tf":1.0},"17":{"tf":1.4142135623730951},"49":{"tf":1.7320508075688772},"96":{"tf":1.0}},"s":{"_":{"df":0,"docs":{},"f":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":0,"docs":{}}}}},"l":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"_":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}},"e":{"!":{"(":{"b":{"df":1,"docs":{"114":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"(":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"116":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"117":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"114":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"117":{"tf":1.7320508075688772}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"_":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"114":{"tf":1.0},"115":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"116":{"tf":1.0},"117":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"c":{"df":1,"docs":{"1":{"tf":1.0}}},"d":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"21":{"tf":1.0},"22":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":12,"docs":{"107":{"tf":1.4142135623730951},"15":{"tf":1.0},"17":{"tf":1.0},"41":{"tf":1.0},"46":{"tf":1.4142135623730951},"5":{"tf":2.23606797749979},"58":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":2.0},"8":{"tf":1.0},"83":{"tf":1.0},"91":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"2":{"df":1,"docs":{"119":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":5,"docs":{"111":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":9,"docs":{"109":{"tf":1.0},"111":{"tf":1.4142135623730951},"112":{"tf":1.7320508075688772},"113":{"tf":2.449489742783178},"114":{"tf":2.0},"115":{"tf":1.7320508075688772},"116":{"tf":1.4142135623730951},"117":{"tf":1.4142135623730951},"122":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"39":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"84":{"tf":1.0}}},"l":{"df":2,"docs":{"11":{"tf":1.0},"38":{"tf":1.0}}}},"p":{"df":1,"docs":{"36":{"tf":1.0}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"120":{"tf":1.0}}}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":4,"docs":{"60":{"tf":2.0},"61":{"tf":1.0},"88":{"tf":1.0},"99":{"tf":1.0}},"s":{"!":{"(":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"60":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"60":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":4,"docs":{"60":{"tf":1.4142135623730951},"84":{"tf":2.6457513110645907},"88":{"tf":1.0},"99":{"tf":1.0}}},"k":{"df":3,"docs":{"18":{"tf":1.0},"47":{"tf":1.0},"78":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"107":{"tf":1.0},"38":{"tf":1.4142135623730951}}},"t":{"df":5,"docs":{"116":{"tf":1.0},"121":{"tf":1.0},"20":{"tf":1.0},"31":{"tf":1.0},"37":{"tf":1.0}}}},"n":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":6,"docs":{"103":{"tf":1.0},"14":{"tf":1.0},"18":{"tf":1.4142135623730951},"47":{"tf":1.0},"48":{"tf":1.4142135623730951},"79":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"r":{"df":1,"docs":{"47":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":3,"docs":{"6":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772},"8":{"tf":1.0}}}},"u":{"df":0,"docs":{},"e":{"df":5,"docs":{"101":{"tf":1.4142135623730951},"109":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"33":{"tf":1.0},"38":{"tf":1.4142135623730951}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"54":{"tf":1.0}}}}}},"t":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":5,"docs":{"104":{"tf":1.0},"107":{"tf":2.0},"41":{"tf":1.0},"61":{"tf":1.0},"85":{"tf":1.4142135623730951}}}}},"df":20,"docs":{"104":{"tf":1.0},"107":{"tf":2.23606797749979},"125":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"27":{"tf":1.4142135623730951},"39":{"tf":2.23606797749979},"41":{"tf":2.0},"46":{"tf":1.0},"48":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":2.449489742783178},"85":{"tf":3.0},"86":{"tf":2.23606797749979},"88":{"tf":1.0},"89":{"tf":1.7320508075688772},"91":{"tf":2.23606797749979},"93":{"tf":1.7320508075688772}},"s":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":5,"docs":{"46":{"tf":1.0},"86":{"tf":1.7320508075688772},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0}}}}},"df":0,"docs":{}},"、":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"90":{"tf":1.0}}},"y":{"df":0,"docs":{},"s":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"90":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{"df":4,"docs":{"106":{"tf":1.0},"107":{"tf":1.0},"52":{"tf":1.0},"90":{"tf":1.0}},"e":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"w":{"df":0,"docs":{},"i":{"d":{"d":{"df":0,"docs":{},"l":{"df":2,"docs":{"126":{"tf":1.0},"99":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":2,"docs":{"52":{"tf":1.4142135623730951},"91":{"tf":1.0}}}},"y":{"df":6,"docs":{"16":{"tf":1.0},"21":{"tf":1.0},"27":{"tf":1.0},"40":{"tf":1.7320508075688772},"44":{"tf":1.4142135623730951},"96":{"tf":1.0}},"p":{"df":0,"docs":{},"e":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"40":{"tf":1.0}}}}},"df":8,"docs":{"104":{"tf":1.0},"109":{"tf":1.0},"21":{"tf":1.7320508075688772},"22":{"tf":2.23606797749979},"23":{"tf":2.8284271247461903},"24":{"tf":2.0},"31":{"tf":1.0},"40":{"tf":1.7320508075688772}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"37":{"tf":1.0}}}}},"df":0,"docs":{}}}},"、":{"1":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}}}},"u":{"1":{"2":{"8":{"df":1,"docs":{"85":{"tf":2.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"85":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"3":{"2":{"df":5,"docs":{"117":{"tf":1.4142135623730951},"40":{"tf":1.0},"8":{"tf":1.7320508075688772},"85":{"tf":2.8284271247461903},"98":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"6":{"4":{"df":5,"docs":{"21":{"tf":2.6457513110645907},"22":{"tf":4.123105625617661},"23":{"tf":3.605551275463989},"24":{"tf":1.0},"85":{"tf":2.0}}},"df":0,"docs":{}},"8":{"df":3,"docs":{"40":{"tf":1.0},"8":{"tf":1.0},"85":{"tf":1.4142135623730951}}},"df":1,"docs":{"17":{"tf":1.0}},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"101":{"tf":1.0}}}}},"b":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"84":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"66":{"tf":2.0},"67":{"tf":1.4142135623730951},"69":{"tf":2.0}}}}}},"o":{"df":1,"docs":{"123":{"tf":1.0}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"y":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"122":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"116":{"tf":1.0},"31":{"tf":1.0}}}},"t":{"df":4,"docs":{"106":{"tf":1.0},"107":{"tf":1.0},"38":{"tf":1.0},"55":{"tf":1.0}}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"38":{"tf":1.4142135623730951},"83":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"63":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"s":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"、":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"122":{"tf":1.0},"23":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":16,"docs":{"11":{"tf":1.0},"114":{"tf":1.4142135623730951},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"117":{"tf":1.4142135623730951},"119":{"tf":1.0},"22":{"tf":2.8284271247461903},"23":{"tf":3.605551275463989},"24":{"tf":2.449489742783178},"25":{"tf":1.4142135623730951},"31":{"tf":1.0},"38":{"tf":1.0},"55":{"tf":1.0},"77":{"tf":1.0},"8":{"tf":1.0},"99":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"10":{"tf":2.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"a":{"!":{"(":{"a":{"df":2,"docs":{"24":{"tf":1.7320508075688772},"54":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"24":{"tf":1.7320508075688772},"54":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"z":{"df":9,"docs":{"120":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":2.8284271247461903},"23":{"tf":5.656854249492381},"24":{"tf":2.8284271247461903},"25":{"tf":1.0},"88":{"tf":1.4142135623730951},"96":{"tf":1.0},"97":{"tf":1.0}}}}}},"v":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"9":{"tf":2.0}},"i":{"d":{"df":1,"docs":{"58":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":3,"docs":{"23":{"tf":2.0},"54":{"tf":1.0},"57":{"tf":1.4142135623730951}}}},"r":{"df":1,"docs":{"7":{"tf":2.23606797749979}},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":4,"docs":{"17":{"tf":1.0},"48":{"tf":1.0},"54":{"tf":1.0},"57":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"107":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":2,"docs":{"107":{"tf":2.8284271247461903},"117":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":2,"docs":{"17":{"tf":1.7320508075688772},"50":{"tf":1.0}},"e":{"c":{"!":{"[":{"0":{"df":0,"docs":{},"u":{"6":{"4":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.0}},"s":{"!":{"[":{"1":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":2,"docs":{"17":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{},"y":{"df":0,"docs":{},"k":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"123":{"tf":1.0}}}}}}}},"i":{"df":6,"docs":{"104":{"tf":1.0},"106":{"tf":1.7320508075688772},"16":{"tf":1.0},"27":{"tf":1.0},"41":{"tf":3.0},"44":{"tf":1.0}},"s":{":":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":4,"docs":{"104":{"tf":1.0},"106":{"tf":1.7320508075688772},"107":{"tf":1.0},"41":{"tf":2.23606797749979}}}}},"_":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"41":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"41":{"tf":2.0}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"60":{"tf":2.23606797749979}}},"r":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"38":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":1,"docs":{"38":{"tf":1.4142135623730951}}}}},"df":1,"docs":{"17":{"tf":1.0}},"e":{"_":{"c":{"a":{"df":0,"docs":{},"n":{"_":{"d":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"77":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":1,"docs":{"15":{"tf":1.7320508075688772}}}}},"t":{"_":{"df":0,"docs":{},"i":{"df":2,"docs":{"46":{"tf":1.0},"57":{"tf":1.0}},"s":{"!":{"(":{"#":{"[":{"$":{"df":0,"docs":{},"m":{"df":1,"docs":{"46":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"46":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"57":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"91":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"60":{"tf":3.0}}}}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"22":{"tf":2.6457513110645907},"23":{"tf":2.8284271247461903},"24":{"tf":2.0}}}}},"df":0,"docs":{},"p":{"df":1,"docs":{"60":{"tf":1.0}}}},"p":{"df":2,"docs":{"105":{"tf":1.0},"108":{"tf":1.0}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"41":{"tf":1.0}}},"l":{"d":{"!":{"\"":{"df":0,"docs":{},"、":{"3":{".":{"1":{"4":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":4,"docs":{"11":{"tf":2.0},"33":{"tf":1.0},"77":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"2":{"df":2,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"s":{"df":2,"docs":{"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"x":{"!":{"(":{"1":{"df":1,"docs":{"68":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"68":{"tf":1.7320508075688772}}},"3":{"df":1,"docs":{"68":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"7":{"df":1,"docs":{"61":{"tf":1.0}}},"8":{"df":1,"docs":{"61":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"7":{"df":0,"docs":{},"f":{"df":1,"docs":{"61":{"tf":1.0}}}},"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"12":{"tf":1.0}}}}}},"df":12,"docs":{"101":{"tf":1.7320508075688772},"17":{"tf":1.4142135623730951},"43":{"tf":1.0},"65":{"tf":2.0},"66":{"tf":3.0},"67":{"tf":2.449489742783178},"68":{"tf":1.7320508075688772},"69":{"tf":3.605551275463989},"70":{"tf":1.0},"75":{"tf":1.4142135623730951},"76":{"tf":3.872983346207417},"9":{"tf":1.7320508075688772}},"o":{"d":{"df":1,"docs":{"60":{"tf":1.0}}},"df":0,"docs":{}}},"y":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"99":{"tf":1.0}}}}}}}}},"df":8,"docs":{"12":{"tf":1.0},"17":{"tf":1.4142135623730951},"23":{"tf":2.449489742783178},"67":{"tf":2.23606797749979},"69":{"tf":3.0},"70":{"tf":2.0},"75":{"tf":1.4142135623730951},"76":{"tf":2.6457513110645907}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"5":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"1":{"tf":1.0}}}}}}},"z":{"df":5,"docs":{"17":{"tf":1.4142135623730951},"23":{"tf":2.0},"60":{"tf":1.4142135623730951},"88":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"101":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"28":{"tf":1.0},"38":{"tf":2.23606797749979}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"=":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"11":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"38":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"title":{"root":{"2":{".":{"0":{"df":1,"docs":{"78":{"tf":1.0}}},"df":0,"docs":{}},"0":{"1":{"5":{"df":1,"docs":{"74":{"tf":1.0}}},"8":{"df":1,"docs":{"77":{"tf":1.0}}},"df":0,"docs":{}},"2":{"1":{".":{"0":{"6":{"df":1,"docs":{"126":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"4":{"df":1,"docs":{"125":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":1,"docs":{"58":{"tf":1.0}}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"8":{"tf":1.0},"93":{"tf":1.0}}}}},"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"99":{"tf":1.0}}}},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"49":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":2,"docs":{"118":{"tf":1.0},"55":{"tf":1.0}}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"49":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"113":{"tf":1.0},"116":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"48":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"29":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"(":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"50":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"31":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"(":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"51":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"i":{"b":{"df":1,"docs":{"62":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"32":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"33":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"61":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"2":{"df":1,"docs":{"119":{"tf":1.0}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"76":{"tf":1.0}}}}}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"62":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"14":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"69":{"tf":1.0},"75":{"tf":1.0}}}}},"df":1,"docs":{"80":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"34":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"6":{"tf":1.0}}}},"t":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":1,"docs":{"35":{"tf":1.0}},"h":{"df":1,"docs":{"37":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"120":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"0":{"tf":1.0},"103":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"57":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"122":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"n":{"df":1,"docs":{"121":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"5":{"tf":1.0},"7":{"tf":1.0}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"60":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":1,"docs":{"7":{"tf":1.0}}}}},"t":{"df":3,"docs":{"39":{"tf":1.0},"84":{"tf":1.0},"91":{"tf":1.0}}},"w":{"df":0,"docs":{},"i":{"d":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"99":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"y":{"df":1,"docs":{"40":{"tf":1.0}}}},"v":{"df":0,"docs":{},"i":{"df":1,"docs":{"41":{"tf":1.0}}}}}}},"lang":"English","pipeline":["trimmer","stopWordFilter","stemmer"],"ref":"id","version":"0.9.5"},"results_options":{"limit_results":30,"teaser_word_count":30},"search_options":{"bool":"OR","expand":true,"fields":{"body":{"boost":1},"breadcrumbs":{"boost":1},"title":{"boost":2}}}}); \ No newline at end of file diff --git a/searchindex.json b/searchindex.json new file mode 100644 index 0000000..63be4bd --- /dev/null +++ b/searchindex.json @@ -0,0 +1 @@ +{"doc_urls":["introduction.html#rust-宏小册","introduction.html#致谢","introduction.html#版权声明","syntax-extensions.html#语法扩展","syntax-extensions/source-analysis.html#源代码解析方式","syntax-extensions/source-analysis.html#标识化-tokenization","syntax-extensions/source-analysis.html#语法解析-parsing","syntax-extensions/source-analysis.html#标记树-token-trees","syntax-extensions/ast.html#ast-中的宏","syntax-extensions/expansion.html#展开","syntax-extensions/hygiene.html#卫生性","syntax-extensions/debugging.html#调试","decl-macros.html#声明宏","decl-macros/macros-methodical.html#思路介绍","decl-macros/macros-methodical.html#macro_rules","decl-macros/macros-methodical.html#匹配","decl-macros/macros-methodical.html#元变量","decl-macros/macros-methodical.html#反复","decl-macros/macros-methodical.html#元变量表达式","decl-macros/macros-practical.html#实战篇","decl-macros/macros-practical.html#一点背景知识","decl-macros/macros-practical.html#构建过程","decl-macros/macros-practical.html#索引与移位","decl-macros/macros-practical.html#替换","decl-macros/macros-practical.html#保持卫生性","decl-macros/macros-practical.html#导出宏","decl-macros/minutiae.html#细节问题","decl-macros/minutiae/fragment-specifiers.html#片段分类符","decl-macros/minutiae/fragment-specifiers.html#block","decl-macros/minutiae/fragment-specifiers.html#expr","decl-macros/minutiae/fragment-specifiers.html#ident","decl-macros/minutiae/fragment-specifiers.html#item","decl-macros/minutiae/fragment-specifiers.html#lifetime","decl-macros/minutiae/fragment-specifiers.html#literal","decl-macros/minutiae/fragment-specifiers.html#meta","decl-macros/minutiae/fragment-specifiers.html#pat","decl-macros/minutiae/fragment-specifiers.html#pat_param","decl-macros/minutiae/fragment-specifiers.html#path","decl-macros/minutiae/fragment-specifiers.html#stmt","decl-macros/minutiae/fragment-specifiers.html#tt","decl-macros/minutiae/fragment-specifiers.html#ty","decl-macros/minutiae/fragment-specifiers.html#vis","decl-macros/minutiae/metavar-and-expansion.html#再谈元变量与宏展开","decl-macros/minutiae/metavar-and-expansion.html#书写宏规则的顺序","decl-macros/minutiae/metavar-and-expansion.html#片段分类符的跟随限制","decl-macros/minutiae/metavar-and-expansion.html#编译器拒绝模糊的规则","decl-macros/minutiae/metavar-and-expansion.html#不基于标记的代换","decl-macros/minutiae/metavar-expr.html#元变量表达式","decl-macros/minutiae/metavar-expr.html#dollar-dollar-","decl-macros/minutiae/metavar-expr.html#countident-depth","decl-macros/minutiae/metavar-expr.html#indexdepth","decl-macros/minutiae/metavar-expr.html#lengthdepth","decl-macros/minutiae/metavar-expr.html#ignoreident","decl-macros/minutiae/hygiene.html#卫生性","decl-macros/minutiae/hygiene.html#宏是部分卫生的","decl-macros/minutiae/hygiene.html#crate-元变量","decl-macros/minutiae/identifiers.html#非标识符的标识符","decl-macros/minutiae/identifiers.html#self","decl-macros/minutiae/identifiers.html#_","decl-macros/minutiae/debugging.html#调试","decl-macros/minutiae/debugging.html#trace_macros","decl-macros/minutiae/debugging.html#log_syntax","decl-macros/minutiae/debugging.html#macro_railroad-lib","decl-macros/minutiae/scoping.html#作用域","decl-macros/minutiae/scoping.html#文本作用域","decl-macros/minutiae/scoping.html#宏在子模块中可见","decl-macros/minutiae/scoping.html#宏在定义之后可见","decl-macros/minutiae/scoping.html#宏与宏之间顺序无关","decl-macros/minutiae/scoping.html#宏可以被暂时覆盖","decl-macros/minutiae/scoping.html#macro_use-属性","decl-macros/minutiae/scoping.html#当宏放在函数内","decl-macros/minutiae/scoping.html#关于宏声明的位置","decl-macros/minutiae/scoping.html#基于路径的作用域","decl-macros/minutiae/import-export.html#导入导出","decl-macros/minutiae/import-export.html#2015-版本","decl-macros/minutiae/import-export.html#macro_use","decl-macros/minutiae/import-export.html#macro_export","decl-macros/minutiae/import-export.html#2018-版本","decl-macros/macros2.html#声明宏-20","decl-macros/macros2.html#语法","decl-macros/macros2.html#macro-是规范的条目","decl-macros/macros2.html#卫生性","decl-macros/patterns.html#模式","decl-macros/patterns/callbacks.html#回调","decl-macros/patterns/tt-muncher.html#增量式-tt-撕咬机","decl-macros/patterns/tt-muncher.html#性能建议","decl-macros/patterns/internal-rules.html#内用规则","decl-macros/patterns/internal-rules.html#性能建议","decl-macros/patterns/push-down-acc.html#下推累积","decl-macros/patterns/push-down-acc.html#性能建议","decl-macros/patterns/repetition-replacement.html#反复替换","decl-macros/patterns/tt-bundling.html#tt-捆绑","decl-macros/building-blocks.html#构件","decl-macros/building-blocks/ast-coercion.html#ast-强制转换","decl-macros/building-blocks/counting.html#计数","decl-macros/building-blocks/counting.html#反复替换","decl-macros/building-blocks/counting.html#递归","decl-macros/building-blocks/counting.html#切片长度","decl-macros/building-blocks/counting.html#枚举计数","decl-macros/building-blocks/counting.html#bit-twiddling","decl-macros/building-blocks/abacus-counting.html#算盘计数","decl-macros/building-blocks/abacus-counting.html#描述分析","decl-macros/building-blocks/abacus-counting.html#算盘游戏","decl-macros/building-blocks/parsing.html#解析-rust","decl-macros/building-blocks/parsing.html#函数","decl-macros/building-blocks/parsing.html#方法","decl-macros/building-blocks/parsing.html#结构体","decl-macros/building-blocks/parsing.html#枚举体","proc-macros.html#过程宏","proc-macros/methodical.html#思路介绍","proc-macros/methodical.html#过程宏的类型","proc-macros/methodical.html#函数式","proc-macros/methodical.html#属性式","proc-macros/methodical.html#derive-式","proc-macros/methodical/function-like.html#函数式过程宏","proc-macros/methodical/attr.html#属性式过程宏","proc-macros/methodical/derive.html#derive-式过程宏","proc-macros/methodical/derive.html#辅助属性","proc-macros/third-party-crates.html#第三方-crates","proc-macros/third-party-crates.html#proc-macro2","proc-macros/third-party-crates.html#quote","proc-macros/third-party-crates.html#syn","proc-macros/hygiene.html#卫生性和-span","translation_statement.html#翻译说明","translation_statement.html#更新日志","translation_statement.html#202204","translation_statement.html#202106"],"index":{"documentStore":{"docInfo":{"0":{"body":26,"breadcrumbs":1,"title":1},"1":{"body":17,"breadcrumbs":0,"title":0},"10":{"body":57,"breadcrumbs":0,"title":0},"100":{"body":0,"breadcrumbs":0,"title":0},"101":{"body":86,"breadcrumbs":0,"title":0},"102":{"body":105,"breadcrumbs":0,"title":0},"103":{"body":8,"breadcrumbs":1,"title":1},"104":{"body":53,"breadcrumbs":0,"title":0},"105":{"body":3,"breadcrumbs":0,"title":0},"106":{"body":107,"breadcrumbs":0,"title":0},"107":{"body":94,"breadcrumbs":0,"title":0},"108":{"body":4,"breadcrumbs":0,"title":0},"109":{"body":32,"breadcrumbs":0,"title":0},"11":{"body":58,"breadcrumbs":0,"title":0},"110":{"body":5,"breadcrumbs":0,"title":0},"111":{"body":7,"breadcrumbs":0,"title":0},"112":{"body":9,"breadcrumbs":0,"title":0},"113":{"body":16,"breadcrumbs":1,"title":1},"114":{"body":24,"breadcrumbs":0,"title":0},"115":{"body":26,"breadcrumbs":0,"title":0},"116":{"body":32,"breadcrumbs":2,"title":1},"117":{"body":42,"breadcrumbs":1,"title":0},"118":{"body":8,"breadcrumbs":2,"title":1},"119":{"body":35,"breadcrumbs":3,"title":2},"12":{"body":17,"breadcrumbs":0,"title":0},"120":{"body":28,"breadcrumbs":2,"title":1},"121":{"body":30,"breadcrumbs":2,"title":1},"122":{"body":17,"breadcrumbs":2,"title":1},"123":{"body":16,"breadcrumbs":0,"title":0},"124":{"body":0,"breadcrumbs":0,"title":0},"125":{"body":3,"breadcrumbs":1,"title":1},"126":{"body":5,"breadcrumbs":1,"title":1},"13":{"body":1,"breadcrumbs":0,"title":0},"14":{"body":35,"breadcrumbs":1,"title":1},"15":{"body":43,"breadcrumbs":0,"title":0},"16":{"body":70,"breadcrumbs":0,"title":0},"17":{"body":79,"breadcrumbs":0,"title":0},"18":{"body":37,"breadcrumbs":0,"title":0},"19":{"body":3,"breadcrumbs":0,"title":0},"2":{"body":5,"breadcrumbs":0,"title":0},"20":{"body":28,"breadcrumbs":0,"title":0},"21":{"body":296,"breadcrumbs":0,"title":0},"22":{"body":394,"breadcrumbs":0,"title":0},"23":{"body":823,"breadcrumbs":0,"title":0},"24":{"body":300,"breadcrumbs":0,"title":0},"25":{"body":43,"breadcrumbs":0,"title":0},"26":{"body":1,"breadcrumbs":0,"title":0},"27":{"body":31,"breadcrumbs":0,"title":0},"28":{"body":11,"breadcrumbs":1,"title":1},"29":{"body":15,"breadcrumbs":1,"title":1},"3":{"body":7,"breadcrumbs":0,"title":0},"30":{"body":14,"breadcrumbs":1,"title":1},"31":{"body":45,"breadcrumbs":1,"title":1},"32":{"body":14,"breadcrumbs":1,"title":1},"33":{"body":15,"breadcrumbs":1,"title":1},"34":{"body":16,"breadcrumbs":1,"title":1},"35":{"body":21,"breadcrumbs":1,"title":1},"36":{"body":50,"breadcrumbs":1,"title":1},"37":{"body":13,"breadcrumbs":1,"title":1},"38":{"body":97,"breadcrumbs":1,"title":1},"39":{"body":9,"breadcrumbs":1,"title":1},"4":{"body":0,"breadcrumbs":0,"title":0},"40":{"body":16,"breadcrumbs":1,"title":1},"41":{"body":99,"breadcrumbs":1,"title":1},"42":{"body":0,"breadcrumbs":0,"title":0},"43":{"body":10,"breadcrumbs":0,"title":0},"44":{"body":28,"breadcrumbs":0,"title":0},"45":{"body":18,"breadcrumbs":0,"title":0},"46":{"body":74,"breadcrumbs":0,"title":0},"47":{"body":18,"breadcrumbs":0,"title":0},"48":{"body":35,"breadcrumbs":2,"title":2},"49":{"body":50,"breadcrumbs":2,"title":2},"5":{"body":59,"breadcrumbs":1,"title":1},"50":{"body":21,"breadcrumbs":1,"title":1},"51":{"body":30,"breadcrumbs":1,"title":1},"52":{"body":25,"breadcrumbs":1,"title":1},"53":{"body":2,"breadcrumbs":0,"title":0},"54":{"body":54,"breadcrumbs":0,"title":0},"55":{"body":40,"breadcrumbs":1,"title":1},"56":{"body":8,"breadcrumbs":0,"title":0},"57":{"body":182,"breadcrumbs":1,"title":1},"58":{"body":46,"breadcrumbs":1,"title":1},"59":{"body":0,"breadcrumbs":0,"title":0},"6":{"body":22,"breadcrumbs":1,"title":1},"60":{"body":84,"breadcrumbs":1,"title":1},"61":{"body":21,"breadcrumbs":1,"title":1},"62":{"body":7,"breadcrumbs":2,"title":2},"63":{"body":14,"breadcrumbs":0,"title":0},"64":{"body":0,"breadcrumbs":0,"title":0},"65":{"body":16,"breadcrumbs":0,"title":0},"66":{"body":34,"breadcrumbs":0,"title":0},"67":{"body":24,"breadcrumbs":0,"title":0},"68":{"body":33,"breadcrumbs":0,"title":0},"69":{"body":78,"breadcrumbs":1,"title":1},"7":{"body":57,"breadcrumbs":2,"title":2},"70":{"body":31,"breadcrumbs":0,"title":0},"71":{"body":7,"breadcrumbs":0,"title":0},"72":{"body":4,"breadcrumbs":0,"title":0},"73":{"body":6,"breadcrumbs":0,"title":0},"74":{"body":0,"breadcrumbs":1,"title":1},"75":{"body":14,"breadcrumbs":1,"title":1},"76":{"body":74,"breadcrumbs":1,"title":1},"77":{"body":24,"breadcrumbs":1,"title":1},"78":{"body":11,"breadcrumbs":3,"title":1},"79":{"body":48,"breadcrumbs":2,"title":0},"8":{"body":131,"breadcrumbs":2,"title":1},"80":{"body":8,"breadcrumbs":3,"title":1},"81":{"body":39,"breadcrumbs":2,"title":0},"82":{"body":0,"breadcrumbs":0,"title":0},"83":{"body":76,"breadcrumbs":0,"title":0},"84":{"body":61,"breadcrumbs":2,"title":1},"85":{"body":69,"breadcrumbs":1,"title":0},"86":{"body":65,"breadcrumbs":0,"title":0},"87":{"body":1,"breadcrumbs":0,"title":0},"88":{"body":328,"breadcrumbs":0,"title":0},"89":{"body":9,"breadcrumbs":0,"title":0},"9":{"body":78,"breadcrumbs":0,"title":0},"90":{"body":31,"breadcrumbs":0,"title":0},"91":{"body":84,"breadcrumbs":2,"title":1},"92":{"body":2,"breadcrumbs":0,"title":0},"93":{"body":33,"breadcrumbs":2,"title":1},"94":{"body":0,"breadcrumbs":0,"title":0},"95":{"body":29,"breadcrumbs":0,"title":0},"96":{"body":150,"breadcrumbs":0,"title":0},"97":{"body":34,"breadcrumbs":0,"title":0},"98":{"body":31,"breadcrumbs":0,"title":0},"99":{"body":209,"breadcrumbs":2,"title":2}},"docs":{"0":{"body":"注意:这是对 Daniel Keep 撰写的书 的续写,自 2016 年初夏以来,那本书就没再更新。 本书的续写者为 Veykril ,使用 mdBook 工具生成。你可以浏览本书的 英文版本 ,和 github 仓库 。 [1] 这本书尝试提炼出 Rust 社区对 Rust 宏的共识,准确地说,是 通过例子 来讲述宏 [2] 。 因此,欢迎 PR 补充和提 issue。 如果你对某些书中的内容不清楚,或者不理解,别害怕提 issue 来请求澄清那部分。本书的目标是尽可能成为最好的(宏)学习资料。 在我学习 Rust 的时候, Little Book of Rust Macros 原作 通过例子 的方式非常给力地帮助过我理解(声明)宏。很遗憾的是,Rust 语言与宏系统持续改进时,原作者不再更新书籍。 这也是我想尽可能地更新这本书的原因,并且我尽可能地把新发现的事情增加到书中,以帮助新的 Rust 宏学习者理解宏系统 —— 这个让很多人困惑的部分。 这本书认为你应该对 Rust 有基本的了解,它不会解释 Rust 语言特性或者与宏无关的结构,但不会假设你提前掌握宏的知识。 你必须至少阅读和理解了 Rust Book 的前七章 —— 当然,建议你阅读完 Rust Book 的大部分内容。 译者注:我对原作和续作进行了梳理,见 翻译说明 。 译者注:2022 年的中文版随续作更新了过程宏,而声明宏也一直在演进。","breadcrumbs":"简介 » Rust 宏小册","id":"0","title":"Rust 宏小册"},"1":{"body":"非常感谢 Daniel Keep 最初写下这本书。 [3] 感谢对原书提出建议和更正的读者: IcyFoxy、 Rym、 TheMicroWorm、 Yurume、 akavel、 cmr、 eddyb、 ogham 和 snake_case。 译者注:非常感谢 Veykril 不懈地更新此书。感谢 DaseinPhaos 对原作的翻译。此外,本书的右侧 TOC 是由 mdbook-theme 所提供。","breadcrumbs":"简介 » 致谢","id":"1","title":"致谢"},"10":{"body":"卫生性 (hygiene) 是宏的一个重要概念。它描述了宏在其语法上下文中工作的能力:不影响或不受其周围环境的影响。 换句话说,这意味着语法扩展应该可以在任何地方调用,而不会干扰其周围的上下文。 在一个完美的世界里,Rust 中的所有语法扩展都是完全卫生的 (fully hygienic),不幸的是情况并非如此,所以应该注意避免编写不是完全卫生的语法扩展。 我们将在这里深入讨论一般的卫生性概念,这些概念会在 Rust 提供的不同语法扩展的相应的卫生性章节中涉及到。 卫生性主要影响从语法扩展产生的标识符和路径。 简而言之,如果由语法扩展创建的标识符不能被调用该语法扩展的环境访问,那么它对于该标识符是卫生的。 同样,如果语法扩展中使用的标识符不能引用到在语法扩展之外定义的内容,则被认为是卫生的。 注意:这里说的“创建”和“使用”是指该标识所在的位置。 之所以说 struct Foo{} 中的 Foo 或 let foo = …; 中的 foo 是被创建的,是因为在某种角度看,它们在其名字下引入了新的东西。 而之所以说 fn foo(_: Foo) {} 中的 Foo 或 foo + 3 中的 foo 是被使用的,是因为从某种角度看,它们正指向某些已存在的东西。 最好的例子用例子来展示。假设某语法扩展 make_local 展开为 let local = 0;,也就是说,它创建了标识符 local,然后假设有以下代码: macro_rules! make_local { () => { let local = 0; }\n}\nfn main() { make_local!(); assert_eq!(local, 0);\n} 如果 assert_eq!(local, 0); 中的 local 被解析为语法扩展所定义的 local,则语法扩展不是卫生的(至少在 local 这个名称/绑定方面不是卫生的)。 现在假设有某语法扩展 use_local 展开为 local = 42;,也就是说,它使用了标识符 local,然后假设有以下代码: // 注释这段声明宏的定义看看会发生什么\nmacro_rules! use_local { () => { local = 42; }\n}\nfn main() { let mut local = 0; // 取消注释这段声明宏的定义看看会发生什么 // macro_rules! use_local { // () => { local = 42; } // } use_local!();\n} 如果给定调用的语法扩展中的 local 被解析为调用前所定义的 local ,则该语法扩展也不是卫生的。 这简短地介绍了卫生性的一般概念。它将在相应的 macro_rules! 和 proc-macro 章节里进行更深入的解释,并阐述其各自的特有之处。","breadcrumbs":"语法拓展 » 卫生性 » 卫生性","id":"10","title":"卫生性"},"100":{"body":"","breadcrumbs":"声明宏 » 构件 » 计数 » 算盘计数 » 算盘计数","id":"100","title":"算盘计数"},"101":{"body":"临时信息:需要更合适的例子。 该用例采用 Rust 分组机制无法表示的匹配嵌套结构, 实在是过于特殊,因此不适作为例子使用。 注意:此节假设读者已经了解 下推累积 以及 标记树撕咬机 。 macro_rules! abacus { ((- $($moves:tt)*) -> (+ $($count:tt)*)) => { abacus!(($($moves)*) -> ($($count)*)) }; ((- $($moves:tt)*) -> ($($count:tt)*)) => { abacus!(($($moves)*) -> (- $($count)*)) }; ((+ $($moves:tt)*) -> (- $($count:tt)*)) => { abacus!(($($moves)*) -> ($($count)*)) }; ((+ $($moves:tt)*) -> ($($count:tt)*)) => { abacus!(($($moves)*) -> (+ $($count)*)) }; // Check if the final result is zero. (() -> ()) => { true }; (() -> ($($count:tt)+)) => { false };\n} fn main() { let equals_zero = abacus!((++-+-+++--++---++----+) -> ()); assert_eq!(equals_zero, true);\n} 这个例子所用的技巧用在如下情况: 记录的计数会发生变化,且初始值为零或在零附近,且必须支持如下操作: 增加一; 减少一; 与 0 (或任何其它固定的有限值)相比较; 数值 n 将由一组共 n 个相同的特定标记来表示。 对数值的修改操作将采用 下推累积 模式由递归调用完成。 假设所采用的特定标记是 x ,则上述操作可实现为: 增加一:匹配($($count:tt)*)并替换为(x $($count)*)。 减少一:匹配(x $($count:tt)*)并替换为($($count)*)。 与0相比较:匹配()。 与1相比较:匹配(x)。 与2相比较:匹配(x x)。 (依此类推...) 作用于计数值的操作将所选的标记来回摆动,如同算盘摆动算子。 [1] 在这句极度单薄的辩解下,隐藏着选用此名称的 真实 理由: 避免造出又一个名含“标记”的术语。今天就该跟你认识的作者谈谈避免 语义饱和 吧! 公平来讲,本来也可以称它为 “一元计数(unary counting)” 。 在想表示负数的情况下,值 -n 可被表示成 n 个相同的其它标记。 在上例中,值 +n 被表示成 n 个 + 标记,而值 -m 被表示成 m 个 - 标记。 有负数的情况下操作起来稍微复杂一些, 增减操作在当前数值为负时实际上互换了角色。 给定 + 和 - 分别作为正数与负数标记,相应操作的实现将变成: 增加一: 匹配 () 并替换为 (+) 匹配 (- $($count:tt)*) 并替换为 ($($count)*) 匹配 ($($count:tt)+) 并替换为 (+ $($count)+) 减少一: 匹配 () 并替换为 (-) 匹配 (+ $($count:tt)*) 并替换为 ($($count)*) 匹配 ($($count:tt)+) 并替换为 (- $($count)+) 与 0 相比较:匹配 () 与 +1 相比较:匹配 (+) 与 -1 相比较:匹配 (-) 与 +2 相比较:匹配 (++) 与 -2 相比较:匹配 (--) (依此类推...) 注意在顶部的示例中,某些规则被合并到一起了 (举例来说,对 () 及 ($($count:tt)+) 的增加操作被合并为对 ($($count:tt)*) 的增加操作)。 如果想要提取出所计数目的实际值,可再使用普通的 计数宏 。对上例来说,终结规则可换为: macro_rules! abacus { // ... // 下列规则将计数替换成实际值的表达式 (() -> ()) => {0}; (() -> (- $($count:tt)*)) => { - ( count_tts!($( $count_tts:tt )*) ) }; (() -> (+ $($count:tt)*)) => { count_tts!($( $count_tts:tt )*) };\n} // 计数一章任选一个宏\nmacro_rules! count_tts { // ...\n} 仅限此例: 严格来说,想要达到此例的效果,没必要做的这么复杂。 如果你不需要在宏中匹配所计的值,可直接采用重复来更加高效地实现: macro_rules! abacus { (-) => {-1}; (+) => {1}; ($( $moves:tt )*) => { 0 $(+ abacus!($moves))* }\n}","breadcrumbs":"声明宏 » 构件 » 计数 » 算盘计数 » 描述分析","id":"101","title":"描述分析"},"102":{"body":"译者注:这章原作者的表述实在过于啰嗦,但是这个例子的确很有意思。 基于这个例子框架,我给出如下浅显而完整的样例代码(可编辑运行): macro_rules! abacus { ((- $($moves:tt)*) -> (+ $($count:tt)*)) => { { println!(\"{} [-]{} | [+]{}\", \"-+1\", stringify!($($moves)*), stringify!($($count)*)); abacus!(($($moves)*) -> ($($count)*)) } }; ((- $($moves:tt)*) -> ($($count:tt)*)) => { { println!(\"{} [-]{} | - {}\", \"- 2\", stringify!($($moves)*), stringify!($($count)*)); abacus!(($($moves)*) -> (- $($count)*)) } }; ((+ $($moves:tt)*) -> (- $($count:tt)*)) => { { println!(\"{} [+]{} | [-]{}\", \"+-3\", stringify!($($moves)*), stringify!($($count)*)); abacus!(($($moves)*) -> ($($count)*)) } }; ((+ $($moves:tt)*) -> ($($count:tt)*)) => { { println!(\"{} [+]{} | + {}\", \"+ 4\", stringify!($($moves)*), stringify!($($count)*)); abacus!(($($moves)*) -> (+ $($count)*)) } }; (() -> ()) => {0}; (() -> (- $($count:tt)*)) => {{-1 + abacus!(() -> ($($count)*)) }}; (() -> (+ $($count:tt)*)) => {{1 + abacus!(() -> ($($count)*)) }};\n} fn main() { println!(\"算盘游戏:左边与右边异号时抵消;非异号时,把左边的符号转移到右边;左边无符号时,游戏结束,计算右边得分\"); println!(\"图示注解:左右符号消耗情况,分支编号,[消失的符号] 左边情况 | [消失的符号] 右边情况\\n\"); println!(\"计数结果:{}\\n\", abacus!((++-+-+) -> (--+-+-))); println!(\"计数结果:{}\\n\", abacus!((++-+-+) -> (++-+-+))); println!(\"计数结果:{}\\n\", abacus!((---+) -> ())); println!(\"计数结果:{}\\n\", abacus!((++-+-+) -> ())); println!(\"计数结果:{}\\n\", abacus!((++-+-+++--++---++----+) -> ())); // 这是作者给的例子 :)\n} 打印结果: 算盘游戏:左边与右边异号时抵消;非异号时,把左边的符号转移到右边;左边无符号时,游戏结束,计算右边得分\n图示注解:左右符号消耗情况,分支编号,[消失的符号] 左边情况 | [消失的符号] 右边情况 +-3 [+]+ - + - + | [-]- + - + -\n+-3 [+]- + - + | [-]+ - + -\n-+1 [-]+ - + | [+]- + -\n+-3 [+]- + | [-]+ -\n-+1 [-]+ | [+]-\n+-3 [+] | [-]\n计数结果:0 + 4 [+]+ - + - + | + + + - + - +\n+ 4 [+]- + - + | + + + + - + - +\n-+1 [-]+ - + | [+]+ + + - + - +\n+ 4 [+]- + | + + + + - + - +\n-+1 [-]+ | [+]+ + + - + - +\n+ 4 [+] | + + + + - + - +\n计数结果:4 - 2 [-]- - + | - - 2 [-]- + | - -\n- 2 [-]+ | - - -\n+-3 [+] | [-]- -\n计数结果:-2 + 4 [+]+ - + - + | + + 4 [+]- + - + | + +\n-+1 [-]+ - + | [+]+\n+ 4 [+]- + | + +\n-+1 [-]+ | [+]+\n+ 4 [+] | + +\n计数结果:2 + 4 [+]+ - + - + + + - - + + - - - + + - - - - + | + + 4 [+]- + - + + + - - + + - - - + + - - - - + | + +\n-+1 [-]+ - + + + - - + + - - - + + - - - - + | [+]+\n+ 4 [+]- + + + - - + + - - - + + - - - - + | + +\n-+1 [-]+ + + - - + + - - - + + - - - - + | [+]+\n+ 4 [+]+ + - - + + - - - + + - - - - + | + +\n+ 4 [+]+ - - + + - - - + + - - - - + | + + +\n+ 4 [+]- - + + - - - + + - - - - + | + + + +\n-+1 [-]- + + - - - + + - - - - + | [+]+ + +\n-+1 [-]+ + - - - + + - - - - + | [+]+ +\n+ 4 [+]+ - - - + + - - - - + | + + +\n+ 4 [+]- - - + + - - - - + | + + + +\n-+1 [-]- - + + - - - - + | [+]+ + +\n-+1 [-]- + + - - - - + | [+]+ +\n-+1 [-]+ + - - - - + | [+]+\n+ 4 [+]+ - - - - + | + +\n+ 4 [+]- - - - + | + + +\n-+1 [-]- - - + | [+]+ +\n-+1 [-]- - + | [+]+\n-+1 [-]- + | [+]\n- 2 [-]+ | - +-3 [+] | [-]\n计数结果:0","breadcrumbs":"声明宏 » 构件 » 计数 » 算盘计数 » 算盘游戏","id":"102","title":"算盘游戏"},"103":{"body":"在有些情况下解析某些 Rust items 会很有用。 这一章会展示一些能够解析 Rust 中更复杂的 items 的宏。 这些宏目的不是解析整个 items 语法,而是解析通用、有用的部分, 解析的方式也不会太复杂。 也就是说,我们不会涉及解析 泛型 之类的东西。 重点在于宏的匹配方式 (matchers) ;展开的部分 ( Reference 里使用的术语叫做 transcribers ), 仅仅用作例子,不需要特别关心它。","breadcrumbs":"声明宏 » 构件 » 解析 » 解析 Rust","id":"103","title":"解析 Rust"},"104":{"body":"macro_rules! function_item_matcher { ( $( #[$meta:meta] )* // ^~~~attributes~~~~^ $vis:vis fn $name:ident ( $( $arg_name:ident : $arg_ty:ty ),* $(,)? ) // ^~~~~~~~~~~~~~~~argument list!~~~~~~~~~~~~~~^ $( -> $ret_ty:ty )? // ^~~~return type~~~^ { $($tt:tt)* } // ^~~~~body~~~~^ ) => { $( #[$meta] )* $vis fn $name ( $( $arg_name : $arg_ty ),* ) $( -> $ret_ty )? { $($tt)* } }\n} #function_item_matcher!(\n# #[inline]\n# #[cold]\n# pub fn foo(bar: i32, baz: i32, ) -> String {\n# format!(\"{} {}\", bar, baz)\n# }\n#);\n#\n# fn main() {\n# assert_eq!(foo(13, 37), \"13 37\");\n# } 这是一个简单的匹配函数的例子, 传入宏的函数不能包含 unsafe、async、泛型和 where 语句。 如果需要解析这些内容,则最好使用 proc-macro (过程宏) 代替。 这个例子可以检查函数签名,从中生成一些额外的东西, 然后再重新返回 (re-emit) 整个函数。 有点像 Derive 过程宏,虽然功能没那么强大,但是是为函数服务的 ( Derive 不作用于函数)。 理想情况下,我们对参数捕获宁愿使用 pat 分类符,而不是 ident 分类符, 但这里目前不被允许(因为前者的跟随限制,不允许其后使用 : )。 幸好在函数签名里面不常使用模式 ( pat ) ,所以这个例子还不错。","breadcrumbs":"声明宏 » 构件 » 解析 » 函数","id":"104","title":"函数"},"105":{"body":"有时我们想解析方法 (methods),方法就是通过 self 的某种形式指向对象的函数。 这让事情变得棘手多了。 WIP (待完善)","breadcrumbs":"声明宏 » 构件 » 解析 » 方法","id":"105","title":"方法"},"106":{"body":"macro_rules! struct_item_matcher { // Unit-Struct ( $( #[$meta:meta] )* // ^~~~attributes~~~~^ $vis:vis struct $name:ident; ) => { $( #[$meta] )* $vis struct $name; }; // Tuple-Struct ( $( #[$meta:meta] )* // ^~~~attributes~~~~^ $vis:vis struct $name:ident ( $( $( #[$field_meta:meta] )* // ^~~~field attributes~~~~^ $field_vis:vis $field_ty:ty // ^~~~~~a single field~~~~~~^ ),* $(,)? ); ) => { $( #[$meta] )* $vis struct $name ( $( $( #[$field_meta] )* $field_vis $field_ty ),* ); }; // Named-Struct ( $( #[$meta:meta] )* // ^~~~attributes~~~~^ $vis:vis struct $name:ident { $( $( #[$field_meta:meta] )* // ^~~~field attributes~~~!^ $field_vis:vis $field_name:ident : $field_ty:ty // ^~~~~~~~~~~~~~~~~a single field~~~~~~~~~~~~~~~^ ),* $(,)? } ) => { $( #[$meta] )* $vis struct $name { $( $( #[$field_meta] )* $field_vis $field_name : $field_ty ),* } }\n} #struct_item_matcher!(\n# #[allow(dead_code)]\n# #[derive(Copy, Clone)]\n# pub(crate) struct Foo { # pub bar: i32,\n# baz: &'static str,\n# qux: f32\n# }\n#);\n#struct_item_matcher!(\n# #[derive(Copy, Clone)]\n# pub(crate) struct Bar;\n#);\n#struct_item_matcher!(\n# #[derive(Clone)]\n# pub(crate) struct Baz (i32, pub f32, String);\n#);\n#fn main() {\n# let _: Foo = Foo { bar: 42, baz: \"macros can be nice\", qux: 3.14, };\n# let _: Bar = Bar;\n# let _: Baz = Baz(2, 0.1234, String::new());\n#}","breadcrumbs":"声明宏 » 构件 » 解析 » 结构体","id":"106","title":"结构体"},"107":{"body":"解析枚举体比解析结构体更复杂一点,所以会用上 模式 这章讨论的技巧: TT 撕咬机 和 内用规则 。 不是重新构造被解析的枚举体,而是只访问枚举体所有的标记 (tokens), 因为重构枚举体将需要我们再通过 下推累积 临时组合所有已解析的标记 (tokens) 。 macro_rules! enum_item_matcher { // tuple variant (@variant $variant:ident ( $( $( #[$field_meta:meta] )* // ^~~~field attributes~~~~^ $field_vis:vis $field_ty:ty // ^~~~~~a single field~~~~~~^ ),* $(,)? //∨~~rest of input~~∨ ) $(, $($tt:tt)* )? ) => { // process rest of the enum $( enum_item_matcher!(@variant $( $tt )*); )? }; // named variant (@variant $variant:ident { $( $( #[$field_meta:meta] )* // ^~~~field attributes~~~!^ $field_vis:vis $field_name:ident : $field_ty:ty // ^~~~~~~~~~~~~~~~~a single field~~~~~~~~~~~~~~~^ ),* $(,)? //∨~~rest of input~~∨ } $(, $($tt:tt)* )? ) => { // process rest of the enum $( enum_item_matcher!(@variant $( $tt )*); )? }; // unit variant (@variant $variant:ident $(, $($tt:tt)* )? ) => { // process rest of the enum $( enum_item_matcher!(@variant $( $tt )*); )? }; // trailing comma (@variant ,) => {}; // base case (@variant) => {}; // entry point ( $( #[$meta:meta] )* $vis:vis enum $name:ident { $($tt:tt)* } ) => { enum_item_matcher!(@variant $($tt)*); };\n} enum_item_matcher!( #[derive(Copy, Clone)] pub(crate) enum Foo { Bar, Baz, }\n);\nenum_item_matcher!( #[derive(Copy, Clone)] pub(crate) enum Bar { Foo(i32, f32), Bar, Baz(), }\n);\nenum_item_matcher!( #[derive(Clone)] pub(crate) enum Baz {}\n); fn main() {}","breadcrumbs":"声明宏 » 构件 » 解析 » 枚举体","id":"107","title":"枚举体"},"108":{"body":"本章将介绍 Rust 的第二种语法扩展类型:过程宏。 与 声明宏 一样,这一部分也分为 思路 和实战 (WIP) 的两个子章节,前者是更正式的介绍,后者是更注重实践的子章。 文中介绍的许多基本信息都来自于 Rust Reference ,因为目前关于过程宏的大部分知识都在那。 译者注:在翻译(或者说知道)这部分内容之前,我自己也总结了一些学习过程宏的经验,你可以 在这 看到。","breadcrumbs":"过程宏 » 过程宏","id":"108","title":"过程宏"},"109":{"body":"本章将从整体角度解释和介绍过程宏。 与 声明宏 不同,过程宏采用 Rust 函数的形式,接受一个(或两个)标记流并输出一个标记流。 过程宏的核心只是一个从 proc-macro crate type 这种类型的库中所导出的公有函数,因此当编写多个过程宏时,你可以将它们全部放在一个 crate 中。 注意:在使用 Cargo 时,定义一个 proc-macro crate 的方式是将 Cargo.toml 中的 lib.proc-macro 键设置为 true,就像这样 [lib]\nproc-macro = true proc-macro 类型的 crate 会隐式链接到编译器提供的 proc_macro 库, proc_macro 库包含了开发过程宏所需的所有内容,并且它公开了两个最重要的类型: TokenStream :它表示我们所熟知的标记树 Span :它表示源代码的一部分,主要用于错误信息的报告和卫生性,更多信息请阅读 卫生性和 Spans 一章 因为过程宏是存在于 crate 中的函数,所以它们可以像 Rust 项目中的所有其他条目一样使用。 使用过程宏只需要将 proc-macro 类型的 crate 添加到项目的依赖关系图中,并将所需的过程宏引入作用域。 注意:调用过程宏与编译器展开成声明宏是在同一阶段运行,只是过程宏是编译器编译、运行、最后替换或追加的独立的 Rust 程序。","breadcrumbs":"过程宏 » 思路 » 思路介绍","id":"109","title":"思路介绍"},"11":{"body":"rustc 提供了许多工具来调试通用的语法扩展,并且针对声明宏和过程宏分别量身定制的一些更具体的工具。 有时,语法扩展所展开的内容会有问题,因为你通常看不到展开的的代码。幸运的是, rustc 通过不稳定的 -Zunpretty=expanded 参数来提供查看展开代码的功能。假设有以下代码: // Shorthand for initializing a `String`.\nmacro_rules! S { ($e:expr) => {String::from($e)};\n} fn main() { let world = S!(\"World\"); println!(\"Hello, {}!\", world);\n} 使用以下命令编译: rustc +nightly -Zunpretty=expanded hello.rs 生成以下输出(针对格式进行了修改): #![feature(prelude_import)]\n#[prelude_import]\nuse std::prelude::rust_2018::*;\n#[macro_use]\nextern crate std;\n// Shorthand for initializing a `String`.\nmacro_rules! S { ($e : expr) => { String :: from($e) } ; } fn main() { let world = String::from(\"World\"); { ::std::io::_print( ::core::fmt::Arguments::new_v1( &[\"Hello, \", \"!\\n\"], &match (&world,) { (arg0,) => [ ::core::fmt::ArgumentV1::new(arg0, ::core::fmt::Display::fmt) ], } ) ); };\n} 除了 rustc 公开了一些方式帮助调试语法扩展之外,对于这里提到的 -Zunpretty=expanded 选项,由 dtolnay 制作的名为 cargo-expand 的 cargo 插件基本上对它进行了包装,使用起来更加方便。 你也可以使用 playground ,点击右上角的 TOOLS 按钮来展开语法扩展!","breadcrumbs":"语法拓展 » 调试 » 调试","id":"11","title":"调试"},"110":{"body":"过程宏实际上存在三种不同的类型,每种类型的性质都略有不同。 [1] 函数式:实现 $name!$input 功能的宏 属性式:实现 #[$input] 功能的属性 derive 式:实现 #[derive($name)] 功能的属性 译者注:你可以参考我 总结的表","breadcrumbs":"过程宏 » 思路 » 过程宏的类型","id":"110","title":"过程宏的类型"},"111":{"body":"#[proc_macro]\npub fn name(input: TokenStream) -> TokenStream { TokenStream::new()\n}","breadcrumbs":"过程宏 » 思路 » 函数式","id":"111","title":"函数式"},"112":{"body":"#[proc_macro_attribute]\npub fn name(attr: TokenStream, input: TokenStream) -> TokenStream { TokenStream::new()\n}","breadcrumbs":"过程宏 » 思路 » 属性式","id":"112","title":"属性式"},"113":{"body":"#[proc_macro_derive(Name)]\npub fn my_derive(input: TokenStream) -> TokenStream { TokenStream::new()\n} 如上所示,每个函数的基本结构是相同的:一个标记了一个属性的公有函数,这个属性定义了它的过程性宏类型,然后函数返回一个 TokenStream。 注意,返回类型必须是一个 TokenStream [2] 。 过程宏也会失败,它们有两种报告错误的方式: panic:此时编译器会捕获到,然后把它作为来自于宏调用的错误发出 调用 compile_error! 注意:如果过程宏内出现无限循环,编译器会长时间等待(挂起),从而造成使用过程宏的 crate 也编译挂起。 译者注:而且这个 TokenStream 类型必须是 proc_macro 所公开的 TokenStream,通常使用 quote 库构造这种类型。","breadcrumbs":"过程宏 » 思路 » derive 式","id":"113","title":"derive 式"},"114":{"body":"类似函数的过程宏,像声明宏那样被调用,即 makro!(…)。 不过,这类宏是三种宏中最简单的一种。它也是唯一一个在单独看调用形式时,无法与声明宏区分开的宏。 类似函数式过程宏的简单编写框架如下所示: use proc_macro::TokenStream; #[proc_macro]\npub fn tlborm_fn_macro(input: TokenStream) -> TokenStream { input\n} 可以看到,这实际上只是从一个 TokenStream 到另一个 TokenStream 的映射,其中 input 是调用分隔符内的标记。 例如,对于示例调用 foo!(bar),输入标记流将由单独的 bar 标记组成。返回的标记流将替换宏调用。 这种宏类型与声明宏具有相同的放置和展开规则,即宏必须在调用位置上输出正确的标记流。 但是,与声明性宏不同,函式过程宏对其输入没有特定的限制。也就是说,在 再谈元变量与宏展开 一章中列出的片段分类符跟随限制在这里不适用,因为过程宏直接作用于标记,而不是根据片段分类符或类似的东西(比如反复)匹配它们。 话虽如此,很明显,过程宏更强大,因为它们可以任意修改其输入,并生成任何所需的输出,只要输出在 Rust 的语法范围内。 用法示例: use tlborm_proc::tlborm_attribute; fn foo() { tlborm_attribute!(be quick; time is mana);\n}","breadcrumbs":"过程宏 » 思路 » 函数式 » 函数式过程宏","id":"114","title":"函数式过程宏"},"115":{"body":"属性式过程宏定义了可添加到条目的的新外部属性。这种宏通过 #[attr] 或 #[attr(…)] 方式调用,其中 … 是任意标记树。 一个属性式过程宏的简单框架如下所示: use proc_macro::TokenStream; #[proc_macro_attribute]\npub fn tlborm_attribute(input: TokenStream, annotated_item: TokenStream) -> TokenStream { annotated_item\n} 这里需要注意的是,与其他两种过程宏不同,这种宏有两个输入参数,而不是一个。 第一个参数是属性名称后面的带分隔符的标记树,不包括它周围的分隔符。如果只有属性名称(其后不带标记树,比如 #[attr]),则这个参数的值为空。 第二个参数是添加了该过程宏属性的条目,但不包括该过程宏所定义的属性。因为这是一个 active 属性,在传递给过程宏之前,该属性将从条目中剥离出来。 返回的标记流将完全替换带被添加了该属性的条目。注意,不一定替换成单个条目,替换的结果可以是 0 或更多条目。 用法示例: use tlborm_proc::tlborm_attribute; #[tlborm_attribute]\nfn foo() {} #[tlborm_attribute(attributes are pretty handsome)]\nfn bar() {}","breadcrumbs":"过程宏 » 思路 » 属性式 » 属性式过程宏","id":"115","title":"属性式过程宏"},"116":{"body":"derive 式过程宏 [1] 为 derive 属性定义了新的输入。这种宏通过将其名称提供给 derive 属性的输入来调用,例如 #[derive(TlbormDerve)]。 译者注:我通常不喜欢把 derive 翻译出来,因为它就像 trait 这个名称那样具体而明确,一目了然。当然,有时我会简写为 “derive 宏”,你称它“派生宏”也行。 一个 derive 式过程宏的简单框架如下所示: use proc_macro::TokenStream; #[proc_macro_derive(TlbormDerive)]\npub fn tlborm_derive(input: TokenStream) -> TokenStream { TokenStream::new()\n} proc_macro_derive 稍微特殊一些,因为它需要一个额外的标识符,此标识符将成为 derive 宏的实际名称。 输入标记流是添加了 derive 属性的条目,也就是说,它将始终是 enum、struct 或者 union 类型,因为这些是 derive 属性仅可以添加上去的条目。 输出的标记流将被 追加 [2] 到带注释的条目所处的块或模块,所以要求标记流由一组有效条目组成。 译者注:属性宏与 derive 宏的显著区别在于,属性宏生成的标记是完全替换性质,而 derive 宏生成的标记是追加性质。 用法示例: use tlborm_proc::TlbormDerive; #[derive(TlbormDerive)]\nstruct Foo;","breadcrumbs":"过程宏 » 思路 » derive 式 » derive 式过程宏","id":"116","title":"derive 式过程宏"},"117":{"body":"derive 宏又有一点特殊,因为它可以添加仅在条目定义范围内可见的附加属性。 这些属性被称为派生宏辅助属性 ( derive macro helper attributes ) ,并且是惰性的( inert )。 辅助属性的目的是在每个结构体字段或枚举体成员的基础上为 derive 宏提供额外的可定制性。 也就是说这些属性可用于附着在字段或成员上,而且不会对其本身产生影响。 又因为它们是“惰性的”,所以它们不会被剥离,并且对所有宏都可见。 [3] 译者注:根据 Reference,除了属性宏的属性是 active 的,其他属性都是 inert 的。 辅助属性的定义方式是向 proc_macro_derive 属性增加 attributes(helper0, helper1, ..) 参数,该参数可包含用逗号分隔的标识符列表(即辅助属性的名称)。 因此,编写带辅助属性的 derive 宏的简单框架如下所示: use proc_macro::TokenStream; #[proc_macro_derive(TlbormDerive, attributes(tlborm_helper))]\npub fn tlborm_derive(item: TokenStream) -> TokenStream { TokenStream::new()\n} 这就是辅助属性的全部内容。在过程宏中使用(或者说消耗)辅助属性,得检查字段和成员的属性,来判断它们是否具有相应的辅助属性。 如果条目使用了所有 derive 宏都未定义的辅助属性,那么会出现错误,因为编译器会尝试将这个辅助属性解析为普通属性(而且这个属性并不存在)。 用法示例: use tlborm_proc::TlbormDerive; #[derive(TlbormDerive)]\nstruct Foo { #[tlborm_helper] field: u32\n} #[derive(TlbormDerive)]\nenum Bar { #[tlborm_helper] Variant { #[tlborm_helper] field: u32 }\n}","breadcrumbs":"过程宏 » 思路 » derive 式 » 辅助属性","id":"117","title":"辅助属性"},"118":{"body":"注意:编写过程宏并不需要自动链接的 proc_macro crate 之外的 crate。这里列出 crates 只是使编写它们变得更简单、更简洁,同时由于增加了依赖项,可能会增加过程宏的编译时间。 过程宏放在 crate 中,因此它们可以自然地依赖于 crates.io 上或其他来源的 crates。 crates 生态系统已经有一些非常实用、为过程宏量身定做的库,本章将快速介绍这些库,其中大部分将在接下来的章节中用来实现示例。 由于这些只是简单的介绍,如果真的需要使用,建议查看每个库的文档以获得更深入的信息。 译者注:你可以阅读我对以下这几个库的 使用总结 。","breadcrumbs":"过程宏 » 第三方 crates » 第三方 crates","id":"118","title":"第三方 crates"},"119":{"body":"你可能会认为 proc-macro2 是 proc_macro 的继承者,但实际上肯定不对! 这个名字可能有点误导,因为 proc-macro2 实际上只是对 proc_macro 的包装,根据其文档,它用于两个特定目的: 将类似与过程宏的功能带到其他上下文中,如 build.rs 和 main.rs 让过程宏可进行单元测试 由于 proc_macro 只能在 proc-macro 类型的库中使用,所以无法直接使用 proc_macro 库。 始终记住,proc-macro2 模仿 proc_macro 的 api,对后者进行包装,让后者的功能在非 proc-macro 类型的库中也能使用。 因此,建议基于 proc-macro2 来开发过程宏代码的库,而不是基于 proc_macro 构建,因为这将使这些库可以进行单元测试,这也是以下列出的库传入和返回 proc-macro2::TokenStream 的原因。 当需要 proc_macro::TokenStream 时,只需对 proc-macro2::TokenStream 进行 .into() 操作即可获得 proc_macro 的版本,反之亦然。 使用 proc-macro2 的过程宏通常会以别名的形式导入,比如使用 use proc-macro2::TokenStream as TokenStream2 来导入 proc-macro2::TokenStream。","breadcrumbs":"过程宏 » 第三方 crates » proc-macro2","id":"119","title":"proc-macro2"},"12":{"body":"本章将介绍 Rust 的声明宏系统: macro_rules! 。 在这一章中有两种不同的介绍,一个 讲思路 ,另一个 讲实践 。 前者会向你阐述一个完整而详尽的系统如何工作,而后者将涵盖更多的实际例子。 因此, 思路介绍 是为那些只希望声明宏系统作为一个整体得到解释的人而设计的,而 实践介绍 则指导人们通过实现单个宏。 在这两个介绍之后,本章还提供了一些常规且有用的 模式 和 构件 ,用于创建功能丰富的声明宏。 关于声明宏的其他资源: Rust Book 的 宏章节 ,这是一个更平易近人的高级解释 Reference macros-by-example 章节,它更深入而精确地讨论了细节 注意:本书在讨论声明宏时,通常会使用术语 mbe ( M acro- B y- E xample)、 mbe macro 或 macro_rules!。","breadcrumbs":"声明宏 » 声明宏","id":"12","title":"声明宏"},"120":{"body":"quote 主要公开了一个声明宏: quote! 。 这个小小的宏让你轻松创建标记流,使用方法是将实际的源代码写出为 Rust 语法。 同时该宏还允许你将标记直接插入到编写的语法中: 使用 #local 语法进行 插值 ,其中 local 指的是当前作用域中的一个 local。 [1] 使用 #(#local)* 来对实现了 ToTokens 的类型的迭代器进行插值,其工作原理类似于声明宏的反复,因为它们允许在反复中使用分隔符和额外的标记。 译者注:这里的“插值”并不局限于插入“值或者表达式”,可以插入任何符合 Rust 语法的东西,比如标识符、条目、模块等等。 let name = /* 某个标识符 */;\nlet exprs = /* 某个对表达式标记流的迭代器 */;\nlet expanded = quote! { impl SomeTrait for #name { // #name 将插入上述的局部名称 fn some_function(&self) -> usize { #( #exprs )+* // 通过迭代生成表达式 } }\n}; 在准备输出时,quote! 是一个非常有用的工具,它避免了通过逐个插入标记来创建标记流。 注意:如前所述,此 crate 使用 proc_macro2,因此 quote! 将返回 proc-macro2::TokenStream 类型。","breadcrumbs":"过程宏 » 第三方 crates » quote","id":"120","title":"quote"},"121":{"body":"syn 是一个解析库,用于将 Rust 标记流解析为 Rust 源代码的语法树。 它是一个功能非常强大的库,使得解析过程宏输入变得非常容易,而 proc_macro 本身不公开任何类型的解析功能,只公开标记。 由于这个库可能是一个严重的编译依赖项,它大量使用 feature 控制来允许用户根据需要将其功能剪裁得尽可能小。 那么,它能提供什么呢?很多东西。 首先,当启用 full feature 时,它具有对所有标准 Rust 语法节点的定义和从而能够完全解析 Rust 语法。 在启用 derive feature (默认开启)之后,它还提供一个 DeriveInput 类型,该类型封装了传递给 derive 宏输入所有信息。 在启用 parsing 和 proc-macro feature (默认开启)之后,DeriveInput 可以直接与 parse_macro_input! 配合使用,以将标记流解析为所需的类型。 如果 Rust 语法不能解决你的问题,或者说你希望解析自定义的非 Rust 语法,那么这个库还提供了一个通用的[解析 API][parse],主要是以 Parse trait 的形式(这需要 parsing feature,默认启用)。 除此之外,该库公开的类型保留了位置信息和 Span,这让过程宏发出详细的错误消息,指向关注点的宏输入。 由于这又是一个过程宏的库,它利用了 proc-macro2 的类型,因此可能需要转换成 proc_macro 的对应类型。 我对 syn 做了更系统的梳理,你可以 阅读一下 。","breadcrumbs":"过程宏 » 第三方 crates » syn","id":"121","title":"syn"},"122":{"body":"本章讨论过程宏的 卫生性 以及对其进行编码的类型 Span 。 TokenStream 中的每个标记都关联了一个 Span,它其中包含一些附加信息。 正如其文档所述,Span 表示“一个源代码区域,以及宏展开的信息”。 Span 指向原始源代码的一个区域(这对于在正确的位置显示诊断信息很重要),并保持该位置的卫生性。 卫生性主要与标识符有关,因为它允许或禁止表示符对调用外部定义的事物进行引用或者被引用。 卫生性有 3 种(这可以从 Span 类型的构造函数看到): 定义处卫生性 ( definition site ) ( unstable ): 表示宏定义处的 Span。带着这种 Span 的标识符不能引用外部定义的内容(即这种标识符无法使用宏定义之外的内容),或者不能被外部调用的东西引用(即宏定义之外的东西无法使用这种标识符)。这就是所谓的“卫生性”。 混合式卫生性 ( mixed site ):表示宏定义处或者调用处的 Span,具体取决于标识符的类型。声明宏使用这种卫生性,见此 此章 。 调用处卫生性 ( call site ):表示调用处的 Span。此时,标识符表现得就像是直接在调用处编写的一样,也就是说,它们可以自由地使用调用之外定义的内容,也可以从外部引用它们。这就是所谓的“不卫生” (unhygienic)。","breadcrumbs":"过程宏 » 卫生性和 Span » 卫生性和 Span","id":"122","title":"卫生性和 Span"},"123":{"body":"本书是续写版本,续写的版本由 Veykril 撰稿,续作对原作有补充和删改。 原作: repo | 渲染版 原作中文翻译: repo | 渲染版 原作及其翻译渲染版本没有使用 mdbook 构建,而是使用 py 来生成 HTML。 在发布文档和运行样板代码方面诸多不便。 而且由于原作在 2016 年没再更新,其内容基于 Rust 2015 版本, 续写的版本也只是把过时的细节更新至 2018 之后的版本。 我认为这本书在阐述 声明宏 方面搭建了一个很小巧精美的骨架,过程宏的资料比较丰富,而且过程宏生态主要围绕 第三方库 开展。 续作及本翻译渲染版本使用 mdbook 构建: 续作: repo | 渲染版 续作中文翻译: repo | 渲染版 另外,此翻译版本提供的阅读功能: 行间代码块大部分可以点击右上角按钮运行,有些可以 编辑 和运行 (目的是快速而方便地验证读者思考的代码能否编译通过)。 只用于展示说明、或者不适合运行的代码只有复制按钮。 区分能编辑代码块的方法:光标能够在代码块中停留和闪动;有同级竖线;右上角有 undo 图标;选中代码时背景色较浅;看代码块的主题颜色。 每个页面右侧都有本章节的 大纲目录 ,可以点击跳转。 如果大纲目录显示不完整,可以缩小浏览器页面;或者收起左侧的章节目录。 大纲目录仅在电脑网页版生效,移动端网页不会显示。 所有 code 蓝色样式、光标移上去有下划线的内容(普通正文或者行内代码)都是链接,可以跳转。 无链接的行内代码样式是这样的:code 。 翻译专有名词时,给出原英文,因为我认为那些词语是初次阅读英文时的障碍, 所以当读者查阅其他英文资料时,就不会感到陌生了。","breadcrumbs":"翻译说明 » 翻译说明","id":"123","title":"翻译说明"},"124":{"body":"","breadcrumbs":"翻译说明 » 更新日志","id":"124","title":"更新日志"},"125":{"body":"主要补充的部分在于: 元变量表达式 macro 2.0 模式:TT “撕咬机” 之类的“模式”章节添加了“性能建议” 过程宏","breadcrumbs":"翻译说明 » 2022.04","id":"125","title":"2022.04"},"126":{"body":"主要补充的部分在于: 元变量 (metavariables) 片段分类符 (fragment-specifiers) 调试 作用域 导入/导出宏 计数:bit twiddling 译者补充: 算盘游戏 构件:解析","breadcrumbs":"翻译说明 » 2021.06","id":"126","title":"2021.06"},"13":{"body":"这一节会介绍 Rust 的 声明宏系统 ,解释该系统如何作为整体运作。 首先会深入构造语法及其关键部分,然后介绍你至少应该了解的通用信息。","breadcrumbs":"声明宏 » 思路 » 思路介绍","id":"13","title":"思路介绍"},"14":{"body":"有了前述知识,我们终于可以介绍 macro_rules! 了。如前所述,macro_rules! 本身就是一个语法扩展,也就是从技术上说,它并不是 Rust 语法的一部分。它的形式如下: macro_rules! $name { $rule0 ; $rule1 ; // … $ruleN ;\n} 至少得有一条规则 ,而且最后一条规则后面的分号可被省略。规则里你可以使用大/中/小括号: {}、[]、() [1] 。每条“规则”都形如: ($matcher) => {$expansion} 译者注:它们的英文名称有时候很重要,因为如果你不认识英文名称的话,会比较难读懂文档(比如 syn )。braces {}、brackets []、parentheses ()。 分组符号可以是任意一种括号,但处于习惯,在模式匹配 (matcher) 外侧使用小括号、展开 (expansion 也可以叫做 transcriber) 外侧使用大括号。 注意:在规则里选择哪种括号并不会影响宏调用。 而且,实际上,你也可以在调用宏时使用这三种中任意一种括号,只不过使用 { ... } 或者 ( ... ); 的话会有所不同(关注点在于末尾跟随的分号 ; )。有末尾分号的宏调用 总是 会被解析成一个条目 (item)。 如果你好奇的话,macro_rules! 的调用将被展开成什么?答案是:空 (nothing)。至少,在 AST 中它被展开为空。它所影响的是编译器内部的结构,以将该宏注册 (register) 进去。因此,技术上讲你可以在任何一个空展开合法的位置使用 macro_rules!。 译者注:这里提到两种情况,定义声明宏和使用(或者说调用)声明宏。而且,在括号的选取上: 定义的规则不关心 ($matcher) => {$expansion} 中的 外层 括号类型,但 matcher 和 expansion 之内的括号属于匹配和展开的内容,所以它们内部使用什么括号取决于你需要什么语法。 假如使用 m! 这个宏,如果该宏展开成条目,则必须使用 m! { ... } 或者 m!( ... );; 如果该宏展开成表达式,你可以使用 m! { ... } 或者 m!( ... ) 或者 m![ ... ]。 实际上,定义宏的括号遵循习惯就好,而使用宏的括号用错的话,只需仔细阅读编译器给你的错误信息,和以上第 2 点,就知道怎么改了。","breadcrumbs":"声明宏 » 思路 » macro_rules!","id":"14","title":"macro_rules!"},"15":{"body":"当一个宏被调用时,macro_rules! 解释器将按照声明顺序一一检查规则。 对每条规则,它都将尝试将输入标记树的内容与该规则的 matcher 进行匹配。某个 matcher [2] 必须与输入 完全 匹配才被认为是一次匹配。 译者注:为了简单起见,我不翻译 matcher 这个术语,它指的是被匹配的部分,也就是声明宏规则的前半段。 如果输入与某个 matcher 相匹配,则该调用将替换成相应的展开内容 (expansion) ;否则,将尝试匹配下条规则。 如果所有规则均匹配失败,则宏展开失败并报错。 最简单的例子是空 matcher: macro_rules! four { () => { 1 + 3 };\n} 当且仅当匹配到空的输入时,匹配成功,即 four!()、four![] 或 four!{} 三种方式调用是匹配成功的 。 注意所用的分组标记并 不需要 匹配定义时采用的分组标记,因为实际上分组标记并未传给调用。 也就是说,你可以通过 four![] 调用上述宏,此调用仍将被视作匹配成功。只有输入的内容才会被纳入匹配考量范围。 matcher 中也可以包含字面上 [3] 的标记树,这些标记树必须被完全匹配。将整个对应标记树在相应位置写下即可。 比如,要匹配标记序列 4 fn ['spang \"whammo\"] @_@ ,我们可以这样写: macro_rules! gibberish { (4 fn ['spang \"whammo\"] @_@) => {...};\n} 使用 gibberish!(4 fn ['spang \"whammo\"] @_@]) 即可成功匹配和调用。 你能写出什么标记树,就可以使用什么标记树。 译者注:这里不是指 Rust 的“字面值”,而是指不考虑含义的标记,比如这个例子中 fn 和 []都不是 Rust 的 literal 标记 ( token ),而是 keyword 和 delimiter 标记,或者从下面谈到的元变量角度看,它们 可以 被 ident 或者 tt 分类符捕获。","breadcrumbs":"声明宏 » 思路 » 匹配","id":"15","title":"匹配"},"16":{"body":"matcher 还可以包含捕获 (captures)。即基于某种通用语法类别来匹配输入,并将结果捕获到元变量 (metavariable) 中,然后将替换元变量到输出。 捕获的书写方式是:先写美元符号 $,然后跟一个标识符,然后是冒号 :,最后是捕获方式,比如 $e:expr。 捕获方式又被称作“片段分类符” ( fragment-specifier ),必须是以下一种: block :一个块(比如一块语句或者由大括号包围的一个表达式) expr :一个表达式 (expression) ident :一个标识符 (identifier),包括关键字 (keywords) item :一个条目(比如函数、结构体、模块、impl 块) lifetime :一个生命周期注解(比如 'foo、'static) literal :一个字面值(比如 \"Hello World!\"、3.14、'🦀') meta :一个元信息(比如 #[...] 和 #![...] 属性内部的东西) pat :一个模式 (pattern) path :一条路径(比如 foo、::std::mem::replace、transmute::<_, int>) stmt :一条语句 (statement) tt :单棵标记树 ty :一个类型 vis :一个可能为空的可视标识符(比如 pub、pub(in crate)) 关于片段分类符更深入的描述请阅读本书的 片段分类符 一章。 比如以下声明宏捕获一个表达式输入到元变量 $e: macro_rules! one_expression { ($e:expr) => {...};\n} 元变量对 Rust 编译器的解析器产生影响,而解析器也会确保元变量总是被“正确无误”地解析。 expr 元变量总是捕获完整且符合 Rust 编译版本的表达式。 你可以在有限的情况下同时结合字面上的标记树和元变量。(见 Metavariables and Expansion Redux 一节) 当元变量已经在 matcher 中确定之后,你只需要写 $name 就能引用元变量。比如: macro_rules! times_five { ($e:expr) => { 5 * $e };\n} 元变量被替换成完整的 AST 节点,这很像宏展开。这也意味着被 $e 捕获的任何标记序列都会被解析成单个完整的表达式。 你也可以一个 matcher 中捕获多个元变量: macro_rules! multiply_add { ($a:expr, $b:expr, $c:expr) => { $a * ($b + $c) };\n} 然后在 expansion 中使用任意次数的元变量: macro_rules! discard { ($e:expr) => {};\n}\nmacro_rules! repeat { ($e:expr) => { $e; $e; $e; };\n} 有一个特殊的元变量叫做 $crate ,它用来指代当前 crate 。","breadcrumbs":"声明宏 » 思路 » 元变量","id":"16","title":"元变量"},"17":{"body":"matcher 可以有反复捕获 (repetition),这使得匹配一连串标记 (token) 成为可能。反复捕获的一般形式为 $ ( ... ) sep rep。 $ 是字面上的美元符号标记 ( ... ) 是被反复匹配的模式,由小括号包围。 sep 是 可选 的分隔标记。它不能是括号或者反复操作符 rep。常用例子有 , 和 ; 。 rep 是 必须 的重复操作符。当前可以是: ?:表示最多一次重复,所以此时不能前跟分隔标记。 *:表示零次或多次重复。 +:表示一次或多次重复。 反复捕获中可以包含任意其他的有效 matcher,比如字面上的标记树、元变量以及任意嵌套的反复捕获。 在 expansion 中,使用被反复捕获的内容时,也采用相同的语法。而且被反复捕获的元变量只能存在于反复语法内。 举例来说,下面这个宏将每一个元素转换成字符串:它先匹配零或多个由逗号分隔的表达式,并分别将它们构造成 Vec 的表达式。 macro_rules! vec_strs { ( // 开始反复捕获 $( // 每个反复必须包含一个表达式 $element:expr ) // 由逗号分隔 , // 0 或多次 * ) => { // 在这个块内用大括号括起来,然后在里面写多条语句 { let mut v = Vec::new(); // 开始反复捕获 $( // 每个反复会展开成下面表达式,其中 $element 被换成相应被捕获的表达式 v.push(format!(\"{}\", $element)); )* v } };\n} fn main() { let s = vec_strs![1, \"a\", true, 3.14159f32]; assert_eq!(s, &[\"1\", \"a\", \"true\", \"3.14159\"]);\n} 你可以在一个反复语句里面使用多次和多个元变量,只要这些元变量以相同的次数重复。所以下面的宏代码正常运行: macro_rules! repeat_two { ($($i:ident)*, $($i2:ident)*) => { $( let $i: (); let $i2: (); )* }\n} fn main () { repeat_two!( a b c d e f, u v w x y z );\n} 但是这下面的不能运行: # macro_rules! repeat_two {\n# ($($i:ident)*, $($i2:ident)*) => {\n# $( let $i: (); let $i2: (); )*\n# }\n# } fn main() { repeat_two!( a b c d e f, x y z );\n} 运行报以下错误: error: meta-variable `i` repeats 6 times, but `i2` repeats 3 times --> src/main.rs:6:10 |\n6 | $( let $i: (); let $i2: (); )* | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^","breadcrumbs":"声明宏 » 思路 » 反复","id":"17","title":"反复"},"18":{"body":"RFC : rfcs#1584 Tracking Issue : rust#83527 Feature : #![feature(macro_metavar_expr)] transcriber [4] 可以包含所谓的元变量表达 (metavariable expressions)。 元变量表达式为 transcriber 提供了关于元变量的信息 —— 这些信息是不容易获得的。 目前除了 $$ 表达式外,它们的一般形式都是 $ { op(...) }:即除了 $$ 以外的所有元变量表达式都涉及反复。 可以使用以下表达式(其中 ident 是所绑定的元变量的名称,而 depth 是整型字面值): ${count(ident)}:最里层反复 $ident 的总次数,相当于 ${count(ident, 0)} ${count(ident,depth)}:第 depth 层反复 $ident 的次数 ${index()}:最里层反复的当前反复的索引,相当于 ${index(0)} ${index(depth)}:在第 depth 层处当前反复的索引,向外计数 ${length()}:最里层反复的重复次数,相当于 ${length(0)} ${length(depth)}:在第 depth 层反复的次数,向外计数 ${ignore(ident)}:绑定 $ident 进行重复,并展开成空 $$:展开为单个 $,这会有效地转义 $ 标记,因此它不会被展开(转写) 即 expansion,指展开的部分,是每条声明宏规则的后半段。 想了解完整的定义语法,可以参考 Rust Reference 书的 Macros By Example 一章。","breadcrumbs":"声明宏 » 思路 » 元变量表达式","id":"18","title":"元变量表达式"},"19":{"body":"本章节将通过一个相对简单、实际的例子来介绍 Rust 的宏系统。 我们不会试图解释整个宏系统错综复杂的构造; 而是试图让读者能够舒适地了解宏的书写方式,以及为何如斯。 在 Rust Book 中也有专门一章 讲解宏 ( 中文版 ), 同样提供了高层面的讲解。 此外,本书也有一章 更富条理的介绍 ,旨在详细阐释宏系统。 译者注:建议初学者跟着文章思路一步步走下去, 从看懂文字说明和样例代码开始,能够运行的代码块运行一遍,看看效果。 把样例代码复制出来跟着文章的说明依次更改。哪一步没跟上,就点右上角的展开按钮; 或者复制按钮,获取未隐藏的代码。","breadcrumbs":"声明宏 » 实战 » 实战篇","id":"19","title":"实战篇"},"2":{"body":"这本书沿袭了原作的版权声明,因此具有 CC BY-SA 4.0 和 MIT license 的双重许可。","breadcrumbs":"简介 » 版权声明","id":"2","title":"版权声明"},"20":{"body":"注意:别慌!我们通篇只会涉及到下面这一点点数学。如果想直接看重点,本小节可被安全跳过。 所谓“递推 (recurrence) 关系”是指这样一个序列, 其中的每个值都由先前的一个或多个值决定, 并最终由一个或多个初始值完全决定。 举例来说, Fibonacci 数列 可被定义为如下关系: \\[ F_{n} = 0, 1, ..., F_{n-1} + F_{n-2}\\] 即序列的前两个数分别为 0 和 1,而第 3 个则为 \\( F_{0} + F_{1} = 0 + 1 = 1\\),第 4 个则为 \\( F_{1} + F_{2} = 1 + 1 = 2\\) ,依此类推。 由于这列值可以永远持续下去,定义一个 fibonacci 的求值函数略显困难。 显然,返回一整列值并不实际。 我们真正需要的,应是某种具有惰求值性质的东西——只在必要的时候才进行运算求值。 在 Rust 中,这样的需求表明,是 Iterator 派上用场的时候了。 实现迭代器并不十分困难,但比较繁琐: 你得自定义一个类型,弄明白该在其中存储什么,然后为它实现 Iterator trait。 其实,递推关系足够简单; 几乎所有的递推关系都可被抽象出来,变成一小段由宏驱动的代码生成机制。 好了,说得已经足够多了,让我们开始干活吧。","breadcrumbs":"声明宏 » 实战 » 一点背景知识","id":"20","title":"一点背景知识"},"21":{"body":"通常来说,在编写新宏时,我所做的第一件事,是决定宏调用的形式。 在我们当前所讨论的情况下,我的初次尝试是这样: let fib = recurrence![a[n] = 0, 1, ..., a[n-1] + a[n-2]]; for e in fib.take(10) { println!(\"{}\", e) } 以此为基点,我们可以向宏的定义迈出第一步, 即便在此时我们尚不了解该宏的展开部分究竟是什么样子。 此步骤的用处在于,如果在此处无法明确如何解析输入语法, 那就可能意味着,整个宏的构思需要改变。 macro_rules! recurrence { ( a[n] = $($inits:expr),+ , ... , $recur:expr ) => { /* ... */ };\n}\n# fn main() {} 假设你并不熟悉相应的语法,让我来解释。 上述代码块使用 macro_rules! 系统定义了一个宏,称为 recurrence! 。 此宏仅包含一条解析规则,它规定,宏的输入必须依次匹配: 一段字面标记序列,a [ n ] = ; 一段 重复 的序列($( ... )),其内元素由,分隔,允许重复一或多次( + ); 重复的内容允许: 一个有效的 表达式 ,它将被捕获至 元变量 inits ($inits:expr) 又一段字面标记序列 , ... ,; 一个有效的 表达式 ,将被捕获至 元变量 recur ($recur:expr)。 最后,规则表明,如果输入被成功匹配,则对该宏的调用将被标记序列 /* ... */ 替换。 值得注意的是,inits,如它命名采用的复数形式所暗示的, 实际上包含所有成功匹配进此重复的表达式,而不仅是第一或最后一个。 不仅如此,它们将被捕获成一个序列,而不是把它们不可逆地拼接在一起。 作为练习,我们将采用上面提及的输入,并研究它被处理的过程。 由 ⌂ 标出的“位置”将揭示下一个需要被匹配的句法模式。 注意在某些情况下,下一个可用元素可能存在多个。 Input 表示所有尚未被消耗的标记。 inits 和 recur 分别表示其对应绑定的内容。 Position Input inits recur a[n] = $($inits:expr),+ , ... , $recur:expr ⌂ a[n] = 0, 1, ..., a[n-1] + a[n-2] a[n] = $($inits:expr),+ , ... , $recur:expr ⌂ [n] = 0, 1, ..., a[n-1] + a[n-2] a[n] = $($inits:expr),+ , ... , $recur:expr ⌂ n] = 0, 1, ..., a[n-1] + a[n-2] a[n] = $($inits:expr),+ , ... , $recur:expr ⌂ ] = 0, 1, ..., a[n-1] + a[n-2] a[n] = $($inits:expr),+ , ... , $recur:expr ⌂ = 0, 1, ..., a[n-1] + a[n-2] a[n] = $($inits:expr),+ , ... , $recur:expr ⌂ 0, 1, ..., a[n-1] + a[n-2] a[n] = $($inits:expr),+ , ... , $recur:expr ⌂ 0, 1, ..., a[n-1] + a[n-2] a[n] = $($inits:expr),+ , ... , $recur:expr ⌂ ⌂ , 1, ..., a[n-1] + a[n-2] 0 注意: 这有两个 `⌂` ,因为下个输入标记既能匹配 重复元素间的分隔符逗号,也能匹配 标志重复结束的逗号。宏系统将同时追踪这两种可能,直到决定具体选择为止。 a[n] = $($inits:expr),+ , ... , $recur:expr ⌂ ⌂ 1, ..., a[n-1] + a[n-2] 0 a[n] = $($inits:expr),+ , ... , $recur:expr ⌂ ⌂ , ..., a[n-1] + a[n-2] 0, 1 注意:第一个被划掉的记号表明, 基于上个被消耗的标记,宏系统排除了一项先前存在的可能。 a[n] = $($inits:expr),+ , ... , $recur:expr ⌂ ..., a[n-1] + a[n-2] 0, 1 a[n] = $($inits:expr),+ , ... , $recur:expr ⌂ , a[n-1] + a[n-2] 0, 1 a[n] = $($inits:expr),+ , ... , $recur:expr ⌂ a[n-1] + a[n-2] 0, 1 a[n] = $($inits:expr),+ , ... , $recur:expr ⌂ 0, 1 a[n-1] + a[n-2] 注意:这一步表明,类似 $recur:expr 的绑定将消耗一个完整的表达式。 究竟什么算是一个完整的表达式,将由编译器决定。 稍后我们会谈到语言其它部分的类似行为。 从此表中得到的最关键收获在于,宏系统会依次“尝试”将提供给它的每个标记当作输入, 然后与提供给它的每条规则进行匹配。我们稍后还将谈回到这一“尝试”。 接下来我们开始写 宏调用完全展开后的形态。 我们想要的结构类似: let fib = { struct Recurrence { mem: [u64; 2], pos: usize, } 这就是我们实际使用的迭代器类型。 其中, mem 负责存储最后计算得到的两个斐波那契值, 以保证递推计算能够顺利进行; pos 则负责记录当前的 n 的值。 附注:此处选用 u64 是因为,对斐波那契数列来说,它已经“足够”了。 先不必担心它是否适用于其它数列,我们会提到这一点的。 impl Iterator for Recurrence { type Item = u64; #[inline] fn next(&mut self) -> Option { if self.pos < 2 { let next_val = self.mem[self.pos]; self.pos += 1; Some(next_val) 我们需要这个 if 分支来返回序列的初始值,没什么技巧。 } else { let a = /* something */; let n = self.pos; let next_val = a[n-1] + a[n-2]; self.mem.TODO_shuffle_down_and_append(next_val); self.pos += 1; Some(next_val) } } } 这段稍微难办一点。 对于具体如何定义 a ,我们稍后再提。 TODO_shuffle_down_and_append 的真面目也将留到稍后揭晓; 我们想让它做到:将 next_val 放至数组末尾, 并将数组中剩下的元素依次前移一格,最后丢掉原先的首元素。 Recurrence { mem: [0, 1], pos: 0 }\n}; for e in fib.take(10) { println!(\"{}\", e) } 最后,我们返回一个该结构的实例。 在随后的代码中,我们将用它来进行迭代。 综上所述,完整的展开应该如下: let fib = { struct Recurrence { mem: [u64; 2], pos: usize, } impl Iterator for Recurrence { type Item = u64; #[inline] fn next(&mut self) -> Option { if self.pos < 2 { let next_val = self.mem[self.pos]; self.pos += 1; Some(next_val) } else { let a = /* something */; let n = self.pos; let next_val = (a[n-1] + a[n-2]); self.mem.TODO_shuffle_down_and_append(next_val.clone()); self.pos += 1; Some(next_val) } } } Recurrence { mem: [0, 1], pos: 0 }\n}; for e in fib.take(10) { println!(\"{}\", e) } 附注:的确,这样做的确意味着每次调用该宏时,我们都会重新定义并实现一个 Recurrence 结构。 如果 #[inline] 属性应用得当,在最终编译出的二进制文件中,大部分冗余都将被优化掉。 在写展开部分的过程中时常检查,也是一个有效的技巧。 如果在过程中发现,展开中的某些内容需要根据调用的不同发生改变, 但这些内容并未被我们的宏语法定义囊括; 那就要去考虑,应该怎样去引入它们。 在此示例中,我们先前用过一次 u64 ,但调用者想要的类型不一定是它; 然而我们的宏语法并没有提供其它选择。因此,我们可以做一些修改。 macro_rules! recurrence { ( a[n]: $sty:ty = $($inits:expr),+ , ... , $recur:expr ) => { /* ... */ };\n} /*\nlet fib = recurrence![a[n]: u64 = 0, 1, ..., a[n-1] + a[n-2]]; for e in fib.take(10) { println!(\"{}\", e) }\n*/\n# fn main() {} 我们加入了一个新的 元变量 sty,它应捕获一个类型 (type) 。 附注:如果你不清楚在捕获冒号之后的部分,那可是几种语法匹配候选项之一。 最常用的包括 item、expr 和 ty。 完整的解释参考 元变量 。 还要注意一点:为方便语言的未来发展,对于跟在某些特定的匹配之后的标记,编译器施加了一些限制。 这种情况常在试图匹配至表达式 (expression) 或语句 (statement) 时出现: 它们后面仅允许跟进 =>、, 和 ; 这些标记之一。 完整清单可在 片段分类符的跟随限制 找到。","breadcrumbs":"声明宏 » 实战 » 构建过程","id":"21","title":"构建过程"},"22":{"body":"在此节中我们将略去一些实际上与宏的联系不太紧密的内容。 这节的目标是,让用户可以通过索引 a 来访问数列中先前的值。 a 应该如同一个滑动窗口 (sliding window), 让我们得以持续访问数列中最近几个(在本例中,两个)值。 通过采用封装类型,我们可以轻易地做到这点: struct IndexOffset<'a> { slice: &'a [u64; 2], offset: usize,\n} impl<'a> Index for IndexOffset<'a> { type Output = u64; #[inline(always)] fn index<'b>(&'b self, index: usize) -> &'b u64 { use std::num::Wrapping; let index = Wrapping(index); let offset = Wrapping(self.offset); let window = Wrapping(2); let real_index = index - offset + window; &self.slice[real_index.0] }\n} 附注:对于新接触 Rust 的人来说,生命周期的概念经常需要一番思考。 我们给出一些简单的解释:'a 和 'b 是生命周期注解, 它们被用于追踪引用一直有效(引用:即一个指向某些数据的借用指针)。 在此例中, IndexOffset 借用了一个指向迭代器数据的引用, 因此,它需要记录该引用能被保持有效的时长,记录的内容正是 'a。 我们用到 'b,是因为 Index::index 函数(下标句法正是通过此函数实现的) 的一个参数也需要生命周期。 'a 和 'b 不一定在所有情况下都相同。 我们并没有显式地声明 'a 和 'b 之间有任何联系,但借用检查器 (borrow checker) 总会确保内存安全性不被意外破坏。 a 的定义将随之变为: let a = IndexOffset { slice: &self.mem, offset: n }; 如何处理 TODO_shuffle_down_and_append 是我们现在剩下的唯一问题了。 我没能在标准库中寻得可以直接使用的方法,但自己造一个出来并不难。 { use std::mem::swap; let mut swap_tmp = next_val; for i in (0..2).rev() { swap(&mut swap_tmp, &mut self.mem[i]); }\n} 它把新值替换至数组末尾,并把其他值向前移动一位。 附注:采用这种做法,将使得我们的代码可同时被用于不可拷贝 (non-copyable) 的类型。 至此,最终起作用的代码将是(可直接在代码块编辑,或者点击右上的运行按钮看看): macro_rules! recurrence { ( a[n]: $sty:ty = $($inits:expr),+ , ... , $recur:expr ) => { /* ... */ };\n} fn main() { /* let fib = recurrence![a[n]: u64 = 0, 1, ..., a[n-1] + a[n-2]]; for e in fib.take(10) { println!(\"{}\", e) } */ let fib = { use std::ops::Index; struct Recurrence { mem: [u64; 2], pos: usize, } struct IndexOffset<'a> { slice: &'a [u64; 2], offset: usize, } impl<'a> Index for IndexOffset<'a> { type Output = u64; #[inline(always)] fn index<'b>(&'b self, index: usize) -> &'b u64 { use std::num::Wrapping; let index = Wrapping(index); let offset = Wrapping(self.offset); let window = Wrapping(2); let real_index = index - offset + window; &self.slice[real_index.0] } } impl Iterator for Recurrence { type Item = u64; #[inline] fn next(&mut self) -> Option { if self.pos < 2 { let next_val = self.mem[self.pos]; self.pos += 1; Some(next_val) } else { let next_val = { let n = self.pos; let a = IndexOffset { slice: &self.mem, offset: n }; (a[n-1] + a[n-2]) }; { use std::mem::swap; let mut swap_tmp = next_val; for i in (0..2).rev() { swap(&mut swap_tmp, &mut self.mem[i]); } } self.pos += 1; Some(next_val) } } } Recurrence { mem: [0, 1], pos: 0 } }; for e in fib.take(10) { println!(\"{}\", e) }\n} 注意我们改变了 n 与 a 的声明顺序, 同时将它们(与递推表达式一起)用一个新区块包裹了起来。 改变声明顺序的理由很明显,因为 n 得在 a 前被定义才能被 a 使用。 而包裹的理由则是:如果不这么做,借用引用 &self.mem 会阻止随后的 swap 操作 (在某物仍存在其它别名时,无法对其进行改变)。 包裹区块将确保 &self.mem 产生的借用在彼时失效。 顺带一提,将交换 mem 的代码包进区块里的唯一原因, 是为了缩减 std::mem::swap 的可用范畴,以保持代码整洁。 如果我们直接拿这段代码来跑,会顺利得到结果: 0\n1\n1\n2\n3\n5\n8\n13\n21\n34 现在,让我们把这段代码复制粘贴进宏的展开部分, 并把它们原本所在的位置换成一次宏调用。这样我们得到: macro_rules! recurrence { ( a[n]: $sty:ty = $($inits:expr),+ , ... , $recur:expr ) => { { /* What follows here is *literally* the code from before, cut and pasted into a new position. No other changes have been made. */ use std::ops::Index; struct Recurrence { mem: [u64; 2], pos: usize, } struct IndexOffset<'a> { slice: &'a [u64; 2], offset: usize, } impl<'a> Index for IndexOffset<'a> { type Output = u64; #[inline(always)] fn index<'b>(&'b self, index: usize) -> &'b u64 { use std::num::Wrapping; let index = Wrapping(index); let offset = Wrapping(self.offset); let window = Wrapping(2); let real_index = index - offset + window; &self.slice[real_index.0] } } impl Iterator for Recurrence { type Item = u64; #[inline] fn next(&mut self) -> Option { if self.pos < 2 { let next_val = self.mem[self.pos]; self.pos += 1; Some(next_val) } else { let next_val = { let n = self.pos; let a = IndexOffset { slice: &self.mem, offset: n }; (a[n-1] + a[n-2]) }; { use std::mem::swap; let mut swap_tmp = next_val; for i in (0..2).rev() { swap(&mut swap_tmp, &mut self.mem[i]); } } self.pos += 1; Some(next_val) } } } Recurrence { mem: [0, 1], pos: 0 } } };\n} fn main() { let fib = recurrence![a[n]: u64 = 0, 1, ..., a[n-1] + a[n-2]]; for e in fib.take(10) { println!(\"{}\", e) }\n} 显然,宏的捕获尚未被用到,但这点很容易修改。 不过,如果尝试编译上述代码,rustc 会中止,并显示: error: local ambiguity: multiple parsing options: built-in NTs expr ('inits') or 1 other option. --> src/main.rs:75:45 |\n75 | let fib = recurrence![a[n]: u64 = 0, 1, ..., a[n-1] + a[n-2]]; | 这里我们撞上了 macro_rules! 的一处的跟随限制。 问题出在那第二个逗号上。 当在展开过程中遇见它时,编译器无法决定是该将它解析成 inits 中的又一个表达式, 还是解析成 ... 。很遗憾,它不够聪明,没办法意识到 ... 不是一个有效的表达式,所以它选择了放弃。 理论上 来说,上述代码应该能奏效,但当前它并不能。 附注:有关宏系统如何解读我们的规则,我之前的确撒了点小谎(指没有从“正确”的规则开始)。 通常来说,宏系统确实应当如我前述的那般运作,但在这里它没有。 macro_rules! 的机制,由此看来,是存在一些小毛病的; 我们不得不记得偶尔去做一些微调,好让它我们期许的那般运作。 在本例中,问题有两个。 宏系统不清楚各式各样的语法元素(如表达式)可由什么样的东西构成, 或不能由什么样的东西构成;那是语法解析器的工作。 在试图捕获复合语法元素(如表达式)的过程中,它如果不是 100% 地确定 应该进行捕获的话,那么无法实行捕获。 换句话说,宏系统可以向语法解析器发出请求,让解析器试图把某段输入当作表达式来进行解析; 但此间无论语法解析器遇见任何问题,都将中止整个进程以示回应。 目前,宏系统处理这种窘境的唯一方式,就是对任何可能产生此类问题的情境加以禁止。 好的一面在于,对于这摊子情况,没有任何人乐于看到。 所以关键词 macro 早已被预留,以备未来更加严密的宏系统使用。 只是直到那天来临之前,我们还是该怎么做就怎么做,乖乖遵循跟随限制 :) 还好,修正方案也很简单:从宏句法中去掉逗号即可。 出于平衡考量,我们将移除 ... 双边的逗号: macro_rules! recurrence { ( a[n]: $sty:ty = $($inits:expr),+ ... $recur:expr ) => { };\n} 可惜作者在这里给的方案早在 1.14 版不再编译通过(由原版翻译者所言), 而且至今(1.54 版,笔者所试)这里也无法使用 ... 编译, 因为 expr 之后只能跟随 =>、,、; 之一 以下续作者修改为编译通过的版本。 我们现在运气不好,因为我们想象出来的语法不会以这种方式工作, 所以让我们只选择一个看起来最适合的。 关键点在于分隔符不被识别,而通常使用 , 或者 ; 作为分隔符, 所以可以把原来的 , ... ,替换成 ; 或者 ; ... ;。 macro_rules! recurrence { ( a[n]: $sty:ty = $($inits:expr),+ ; ... ; $recur:expr ) => {\n// ^~~~~~^ changed /* ... */\n# // Cheat :D\n# (vec![0u64, 1, 2, 3, 5, 8, 13, 21, 34]).into_iter() };\n} fn main() { let fib = recurrence![a[n]: u64 = 0, 1; ...; a[n-1] + a[n-2]];\n// ^~~~~^ changed for e in fib.take(10) { println!(\"{}\", e) }\n} 成功!现在,我们该将捕获部分捕获到的内容替代进展开部分中了。","breadcrumbs":"声明宏 » 实战 » 索引与移位","id":"22","title":"索引与移位"},"23":{"body":"在宏中替换你捕获到的内容非常简单, 通过 $sty:ty 捕获到的内容可用 $sty 来替换。 好,让我们换掉那些 u64 吧: macro_rules! recurrence { ( a[n]: $sty:ty = $($inits:expr),+ ; ... ; $recur:expr ) => { { use std::ops::Index; struct Recurrence { mem: [$sty; 2],\n// ^~~~ changed pos: usize, } struct IndexOffset<'a> { slice: &'a [$sty; 2],\n// ^~~~ changed offset: usize, } impl<'a> Index for IndexOffset<'a> { type Output = $sty;\n// ^~~~ changed #[inline(always)] fn index<'b>(&'b self, index: usize) -> &'b $sty {\n// ^~~~ changed use std::num::Wrapping; let index = Wrapping(index); let offset = Wrapping(self.offset); let window = Wrapping(2); let real_index = index - offset + window; &self.slice[real_index.0] } } impl Iterator for Recurrence { type Item = $sty;\n// ^~~~ changed #[inline] fn next(&mut self) -> Option<$sty> {\n// ^~~~ changed /* ... */\n# if self.pos < 2 {\n# let next_val = self.mem[self.pos];\n# self.pos += 1;\n# Some(next_val)\n# } else {\n# let next_val = {\n# let n = self.pos;\n# let a = IndexOffset { slice: &self.mem, offset: n };\n# (a[n-1] + a[n-2])\n# };\n# # {\n# use std::mem::swap;\n# # let mut swap_tmp = next_val;\n# for i in (0..2).rev() {\n# swap(&mut swap_tmp, &mut self.mem[i]);\n# }\n# }\n# # self.pos += 1;\n# Some(next_val)\n# } } } Recurrence { mem: [0, 1], pos: 0 } } };\n} fn main() { let fib = recurrence![a[n]: u64 = 0, 1; ...; a[n-1] + a[n-2]]; for e in fib.take(10) { println!(\"{}\", e) }\n} 现在让我们来尝试更难的:如何将 inits 同时转变为字面值 [0, 1] 以及数组类型 [$sty; 2] 。首先我们试试: Recurrence { mem: [$($inits),+], pos: 0 }\n// ^~~~~~~~~~~ changed 此段代码与捕获的效果正好相反:将 inits 捕得的内容排列开来,总共有 1 或多次, 每条内容之间用逗号分隔。展开的结果与期望一致,我们得到标记序列:0, 1。 不过,通过 inits 转换出字面值 2 需要一些技巧。 没有直接可行的方法,但我们可以通过另一个宏做到。我们一步一步来。 macro_rules! count_exprs { /* ??? */\n# () => {}\n}\n# fn main() {} 先写显而易见的情况:未给表达式时,我们期望count_exprs展开为字面值0。 macro_rules! count_exprs { () => (0);\n// ^~~~~~~~~~ added\n}\n# fn main() {\n# const _0: usize = count_exprs!();\n# assert_eq!(_0, 0);\n# } 附注:你可能已经注意到了,这里的展开部分我用的是括号而非花括号。 macro_rules! 其实不关心你用的是什么,只要它成对匹配即可:( )、{ } 或 [ ]。 实际上,宏本身的匹配符(即紧跟宏名称后的匹配符)、 语法规则外的匹配符及相应展开部分外的匹配符都可以替换。 调用宏时的括号也可被替换,但有些限制:当宏被以 {...} 或 (...); 形式调用时, 它总是会被解析为一个条目(item,比如 struct 或 fn 声明)。 在函数体内部时,这一特征很重要,它将消除“解析成表达式”和“解析成语句”之间的歧义。 有一个表达式的情况该怎么办?应该展开为字面值 1 。 macro_rules! count_exprs { () => (0); ($e:expr) => (1);\n// ^~~~~~~~~~~~~~~~~ added\n}\n# fn main() {\n# const _0: usize = count_exprs!();\n# const _1: usize = count_exprs!(x);\n# assert_eq!(_0, 0);\n# assert_eq!(_1, 1);\n# } 两个呢? macro_rules! count_exprs { () => (0); ($e:expr) => (1); ($e0:expr, $e1:expr) => (2);\n// ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ added\n}\n# fn main() {\n# const _0: usize = count_exprs!();\n# const _1: usize = count_exprs!(x);\n# const _2: usize = count_exprs!(x, y);\n# assert_eq!(_0, 0);\n# assert_eq!(_1, 1);\n# assert_eq!(_2, 2);\n# } 通过递归调用重新表达,我们可将扩展部分“精简”出来: macro_rules! count_exprs { () => (0); ($e:expr) => (1); ($e0:expr, $e1:expr) => (1 + count_exprs!($e1));\n// ^~~~~~~~~~~~~~~~~~~~~ changed\n}\n# fn main() {\n# const _0: usize = count_exprs!();\n# const _1: usize = count_exprs!(x);\n# const _2: usize = count_exprs!(x, y);\n# assert_eq!(_0, 0);\n# assert_eq!(_1, 1);\n# assert_eq!(_2, 2);\n# } 这样做可行是因为,Rust可将 1 + 1 合并成一个常量。 那么,三种表达式的情况呢? macro_rules! count_exprs { () => (0); ($e:expr) => (1); ($e0:expr, $e1:expr) => (1 + count_exprs!($e1)); ($e0:expr, $e1:expr, $e2:expr) => (1 + count_exprs!($e1, $e2));\n// ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ added\n}\n# fn main() {\n# const _0: usize = count_exprs!();\n# const _1: usize = count_exprs!(x);\n# const _2: usize = count_exprs!(x, y);\n# const _3: usize = count_exprs!(x, y, z);\n# assert_eq!(_0, 0);\n# assert_eq!(_1, 1);\n# assert_eq!(_2, 2);\n# assert_eq!(_3, 3);\n# } 附注:你可能会想,我们是否能翻转这些规则的排列顺序。 在此情境下,可以。但在有些情况下,宏系统可能会对此挑剔。 如果你发现自己有一个包含多项规则的宏系统老是报错,或给出期望外的结果; 但你发誓它应该能用,试着调换一下规则的排序吧。 我们希望你现在已经能看出规律。 通过匹配至一个表达式加上 0 或多个表达式并展开成 1+a,我们可以减少规则列表的数目: macro_rules! count_exprs { () => (0); ($head:expr) => (1); ($head:expr, $($tail:expr),*) => (1 + count_exprs!($($tail),*));\n// ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ changed\n}\n# fn main() {\n# const _0: usize = count_exprs!();\n# const _1: usize = count_exprs!(x);\n# const _2: usize = count_exprs!(x, y);\n# const _3: usize = count_exprs!(x, y, z);\n# assert_eq!(_0, 0);\n# assert_eq!(_1, 1);\n# assert_eq!(_2, 2);\n# assert_eq!(_3, 3);\n# } 仅对此例: 这段代码并非计数仅有或其最好的方法。 若有兴趣,稍后可以研读 计数 一节。 有此工具后,我们可再次修改 recurrence ,确定 mem 所需的大小。 // added:\nmacro_rules! count_exprs { () => (0); ($head:expr) => (1); ($head:expr, $($tail:expr),*) => (1 + count_exprs!($($tail),*));\n} macro_rules! recurrence { ( a[n]: $sty:ty = $($inits:expr),+ ; ... ; $recur:expr ) => { { use std::ops::Index; const MEM_SIZE: usize = count_exprs!($($inits),+);\n// ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ added struct Recurrence { mem: [$sty; MEM_SIZE],\n// ^~~~~~~~ changed pos: usize, } struct IndexOffset<'a> { slice: &'a [$sty; MEM_SIZE],\n// ^~~~~~~~ changed offset: usize, } impl<'a> Index for IndexOffset<'a> { type Output = $sty; #[inline(always)] fn index<'b>(&'b self, index: usize) -> &'b $sty { use std::num::Wrapping; let index = Wrapping(index); let offset = Wrapping(self.offset); let window = Wrapping(MEM_SIZE);\n// ^~~~~~~~ changed let real_index = index - offset + window; &self.slice[real_index.0] } } impl Iterator for Recurrence { type Item = $sty; #[inline] fn next(&mut self) -> Option<$sty> { if self.pos < MEM_SIZE {\n// ^~~~~~~~ changed let next_val = self.mem[self.pos]; self.pos += 1; Some(next_val) } else { let next_val = { let n = self.pos; let a = IndexOffset { slice: &self.mem, offset: n }; (a[n-1] + a[n-2]) }; { use std::mem::swap; let mut swap_tmp = next_val; for i in (0..MEM_SIZE).rev() {\n// ^~~~~~~~ changed swap(&mut swap_tmp, &mut self.mem[i]); } } self.pos += 1; Some(next_val) } } } Recurrence { mem: [$($inits),+], pos: 0 } } };\n}\n/* ... */\n# # fn main() {\n# let fib = recurrence![a[n]: u64 = 0, 1; ...; a[n-1] + a[n-2]];\n# # for e in fib.take(10) { println!(\"{}\", e) }\n# } 完成之后,我们开始替换最后的 recur 表达式。 # macro_rules! count_exprs {\n# () => (0);\n# ($head:expr $(, $tail:expr)*) => (1 + count_exprs!($($tail),*));\n# }\n# macro_rules! recurrence {\n# ( a[n]: $sty:ty = $($inits:expr),+ ; ... ; $recur:expr ) => {\n# {\n# use std::ops::Index;\n#\n# const MEM_SIZE: usize = count_exprs!($($inits),+);\n# struct Recurrence {\n# mem: [$sty; MEM_SIZE],\n# pos: usize,\n# }\n# struct IndexOffset<'a> {\n# slice: &'a [$sty; MEM_SIZE],\n# offset: usize,\n# }\n# impl<'a> Index for IndexOffset<'a> {\n# type Output = $sty;\n#\n# #[inline(always)]\n# fn index<'b>(&'b self, index: usize) -> &'b $sty {\n# use std::num::Wrapping;\n# # let index = Wrapping(index);\n# let offset = Wrapping(self.offset);\n# let window = Wrapping(MEM_SIZE);\n# # let real_index = index - offset + window;\n# &self.slice[real_index.0]\n# }\n# }\n# impl Iterator for Recurrence {\n# type Item = $sty;\n/* ... */ #[inline] fn next(&mut self) -> Option { if self.pos < MEM_SIZE { let next_val = self.mem[self.pos]; self.pos += 1; Some(next_val) } else { let next_val = { let n = self.pos; let a = IndexOffset { slice: &self.mem, offset: n }; $recur\n// ^~~~~~ changed }; { use std::mem::swap; let mut swap_tmp = next_val; for i in (0..MEM_SIZE).rev() { swap(&mut swap_tmp, &mut self.mem[i]); } } self.pos += 1; Some(next_val) } }\n/* ... */\n# }\n# Recurrence { mem: [$($inits),+], pos: 0 }\n# }\n# };\n# }\n# fn main() {\n# let fib = recurrence![a[n]: u64 = 1, 1; ...; a[n-1] + a[n-2]];\n# for e in fib.take(10) { println!(\"{}\", e) }\n# } 现在试图编译的话... error[E0425]: cannot find value `a` in this scope --> src/main.rs:68:50 |\n68 | let fib = recurrence![a[n]: u64 = 1, 1; ...; a[n-1] + a[n-2]]; | ^ not found in this scope error[E0425]: cannot find value `n` in this scope --> src/main.rs:68:52 |\n68 | let fib = recurrence![a[n]: u64 = 1, 1; ...; a[n-1] + a[n-2]]; | ^ not found in this scope error[E0425]: cannot find value `a` in this scope --> src/main.rs:68:59 |\n68 | let fib = recurrence![a[n]: u64 = 1, 1; ...; a[n-1] + a[n-2]]; | ^ not found in this scope error[E0425]: cannot find value `n` in this scope --> src/main.rs:68:61 |\n68 | let fib = recurrence![a[n]: u64 = 1, 1; ...; a[n-1] + a[n-2]]; | ^ not found in this scope ...等等,什么情况?这没道理...让我们看看宏究竟展开成了什么样子。 $ rustc -Z unstable-options --pretty expanded recurrence.rs 参数 --pretty expanded 将促使 rustc 展开宏,并将输出的 AST 再重转为源代码。 此选项当前被认定为是 unstable ,因此我们还要添加 -Z unstable-options 。 输出的信息(经过整理格式后)如下;特别留意 $recur 被替换掉的位置: #![feature(no_std)]\n#![no_std]\n#[prelude_import]\nuse std::prelude::v1::*;\n#[macro_use]\nextern crate std as std;\nfn main() { let fib = { use std::ops::Index; const MEM_SIZE: usize = 1 + 1; struct Recurrence { mem: [u64; MEM_SIZE], pos: usize, } struct IndexOffset<'a> { slice: &'a [u64; MEM_SIZE], offset: usize, } impl <'a> Index for IndexOffset<'a> { type Output = u64; #[inline(always)] fn index<'b>(&'b self, index: usize) -> &'b u64 { use std::num::Wrapping; let index = Wrapping(index); let offset = Wrapping(self.offset); let window = Wrapping(MEM_SIZE); let real_index = index - offset + window; &self.slice[real_index.0] } } impl Iterator for Recurrence { type Item = u64; #[inline] fn next(&mut self) -> Option { if self.pos < MEM_SIZE { let next_val = self.mem[self.pos]; self.pos += 1; Some(next_val) } else { let next_val = { let n = self.pos; let a = IndexOffset{slice: &self.mem, offset: n,}; a[n - 1] + a[n - 2] }; { use std::mem::swap; let mut swap_tmp = next_val; { let result = match ::std::iter::IntoIterator::into_iter((0..MEM_SIZE).rev()) { mut iter => loop { match ::std::iter::Iterator::next(&mut iter) { ::std::option::Option::Some(i) => { swap(&mut swap_tmp, &mut self.mem[i]); } ::std::option::Option::None => break, } }, }; result } } self.pos += 1; Some(next_val) } } } Recurrence{mem: [0, 1], pos: 0,} }; { let result = match ::std::iter::IntoIterator::into_iter(fib.take(10)) { mut iter => loop { match ::std::iter::Iterator::next(&mut iter) { ::std::option::Option::Some(e) => { ::std::io::_print(::std::fmt::Arguments::new_v1( { static __STATIC_FMTSTR: &'static [&'static str] = &[\"\", \"\\n\"]; __STATIC_FMTSTR }, &match (&e,) { (__arg0,) => [::std::fmt::ArgumentV1::new(__arg0, ::std::fmt::Display::fmt)], } )) } ::std::option::Option::None => break, } }, }; result }\n} 呃..这看起来完全合法! 如果我们加上几条 #![feature(...)] 属性,并把它送去给一个 nightly 版本的 rustc, 甚至真能通过编译...究竟什么情况?! 附注:上述代码无法通过非 nightly 版 rustc 编译。 这是因为, println! 宏的展开结果依赖于编译器内部的细节,这些细节尚未被公开稳定化。","breadcrumbs":"声明宏 » 实战 » 替换","id":"23","title":"替换"},"24":{"body":"这儿的问题在于,Rust 宏中的标识符具有卫生性。 这就是说,出自不同上下文的标识符不可能发生冲突。 作为演示,举个简单的例子。 macro_rules! using_a { ($e:expr) => { { let a = 42i; $e } }\n} let four = using_a!(a / 10);\n# fn main() {} 此宏接受一个表达式,然后把它包进一个定义了变量 a 的代码块里。 我们随后用它绕个弯子来求 4 。 这个例子中实际上存在 2 种句法上下文,但我们看不见它们。 为了帮助说明,我们给每个上下文都上一种不同的颜色。 我们从未展开的代码开始上色,此时仅看得见一种上下文: macro_rules! using_a { ($e:expr) => { { let a = 42; $e } }\n} let four = using_a!(a / 10); 现在,展开宏调用。 let four = { let a = 42; a / 10\n}; 可以看到,在宏中定义的a 与调用所提供的a处于不同的上下文中。 因此,虽然它们的字母表示一致,编译器仍将它们视作完全不同的标识符。 宏的这一特性需要格外留意:它们可能会产出无法通过编译的 AST; 但同样的代码,手写或通过 --pretty expanded 转印出来则能够通过编译。 解决方案是,采用合适的句法上下文来捕获标识符。我们沿用上例,并作修改: macro_rules! using_a { ($a:ident, $e:expr) => { { let $a = 42; $e } }\n} let four = using_a!(a, a / 10); 现在它将展开为: let four = { let a = 42; a / 10\n}; 上下文现在匹配了,编译通过。 我们的 recurrence! 宏也可被如此调整: 显式地捕获a与n即可。调整后我们得到: macro_rules! count_exprs { () => (0); ($head:expr) => (1); ($head:expr, $($tail:expr),*) => (1 + count_exprs!($($tail),*));\n} macro_rules! recurrence { ( $seq:ident [ $ind:ident ]: $sty:ty = $($inits:expr),+ ; ... ; $recur:expr ) => {\n// ^~~~~~~~~~ ^~~~~~~~~~ changed { use std::ops::Index; const MEM_SIZE: usize = count_exprs!($($inits),+); struct Recurrence { mem: [$sty; MEM_SIZE], pos: usize, } struct IndexOffset<'a> { slice: &'a [$sty; MEM_SIZE], offset: usize, } impl<'a> Index for IndexOffset<'a> { type Output = $sty; #[inline(always)] fn index<'b>(&'b self, index: usize) -> &'b $sty { use std::num::Wrapping; let index = Wrapping(index); let offset = Wrapping(self.offset); let window = Wrapping(MEM_SIZE); let real_index = index - offset + window; &self.slice[real_index.0] } } impl Iterator for Recurrence { type Item = $sty; #[inline] fn next(&mut self) -> Option<$sty> { if self.pos < MEM_SIZE { let next_val = self.mem[self.pos]; self.pos += 1; Some(next_val) } else { let next_val = { let $ind = self.pos;\n// ^~~~ changed let $seq = IndexOffset { slice: &self.mem, offset: $ind };\n// ^~~~ changed $recur }; { use std::mem::swap; let mut swap_tmp = next_val; for i in (0..MEM_SIZE).rev() { swap(&mut swap_tmp, &mut self.mem[i]); } } self.pos += 1; Some(next_val) } } } Recurrence { mem: [$($inits),+], pos: 0 } } };\n} fn main() { let fib = recurrence![a[n]: u64 = 0, 1; ...; a[n-1] + a[n-2]]; for e in fib.take(10) { println!(\"{}\", e) }\n} 通过编译了!接下来,我们试试别的数列。 # macro_rules! count_exprs {\n# () => (0);\n# ($head:expr) => (1);\n# ($head:expr, $($tail:expr),*) => (1 + count_exprs!($($tail),*));\n# }\n# # macro_rules! recurrence {\n# ( $seq:ident [ $ind:ident ]: $sty:ty = $($inits:expr),+ ; ... ; $recur:expr ) => {\n# {\n# use std::ops::Index;\n# # const MEM_SIZE: usize = count_exprs!($($inits),+);\n# # struct Recurrence {\n# mem: [$sty; MEM_SIZE],\n# pos: usize,\n# }\n# # struct IndexOffset<'a> {\n# slice: &'a [$sty; MEM_SIZE],\n# offset: usize,\n# }\n# # impl<'a> Index for IndexOffset<'a> {\n# type Output = $sty;\n# # #[inline(always)]\n# fn index<'b>(&'b self, index: usize) -> &'b $sty {\n# use std::num::Wrapping;\n# # let index = Wrapping(index);\n# let offset = Wrapping(self.offset);\n# let window = Wrapping(MEM_SIZE);\n# # let real_index = index - offset + window;\n# &self.slice[real_index.0]\n# }\n# }\n# # impl Iterator for Recurrence {\n# type Item = $sty;\n# # #[inline]\n# fn next(&mut self) -> Option<$sty> {\n# if self.pos < MEM_SIZE {\n# let next_val = self.mem[self.pos];\n# self.pos += 1;\n# Some(next_val)\n# } else {\n# let next_val = {\n# let $ind = self.pos;\n# let $seq = IndexOffset { slice: &self.mem, offset: $ind };\n# $recur\n# };\n# # {\n# use std::mem::swap;\n# # let mut swap_tmp = next_val;\n# for i in (0..MEM_SIZE).rev() {\n# swap(&mut swap_tmp, &mut self.mem[i]);\n# }\n# }\n# # self.pos += 1;\n# Some(next_val)\n# }\n# }\n# }\n# # Recurrence { mem: [$($inits),+], pos: 0 }\n# }\n# };\n# }\n# # fn main() {\nfor e in recurrence!(f[i]: f64 = 1.0; ...; f[i-1] * i as f64).take(10) { println!(\"{}\", e)\n}\n# } 运行上述代码得到: 1\n1\n2\n6\n24\n120\n720\n5040\n40320\n362880 成功!","breadcrumbs":"声明宏 » 实战 » 保持卫生性","id":"24","title":"保持卫生性"},"25":{"body":"译者注: 导出宏 这部分内容由译者所补充。 这个例子的代码是放在 bin crate 中运行的,如果把 宏 的代码放在 lib crate, main 函数放在 bin crate,那么需要做一点更改。(即使它们都处于同一个 package 下) 假设 recurrence! 和其依赖的 count_exprs! 被定义在 macs lib crate, 根据 导入/导出宏#2018 版本 小节。 首先你得把这两个宏导出,否则使用 macs lib 的 crate 会找不到宏: #[macro_export]\nmacro_rules! count_exprs { /* */ } #[macro_export]\nmacro_rules! recurrence { /* */ } 其次,你需要在 recurrence! 中引入 count_exprs!,使用: // --snippet-- #[macro_export]\nmacro_rules! recurrence { ( $seq:ident [ $ind:ident ]: $sty:ty = $($inits:expr),+ ; ... ; $recur:expr ) => { { use std::ops::Index; use $crate::count_exprs; // 导入 const MEM_SIZE: usize = count_exprs!($($inits),+); // --snippet--","breadcrumbs":"声明宏 » 实战 » 导出宏","id":"25","title":"导出宏"},"26":{"body":"本节将介绍 macro_rules! 宏系统的一些细枝末节。你至少应该 记住 有这些东西存在。","breadcrumbs":"声明宏 » 细节 » 细节问题","id":"26","title":"细节问题"},"27":{"body":"正如在 思路 一章看到的,截至 1.60 版本, Rust 已有 14 个片段分类符 (Fragment Specifiers,以下简称分类符) [1] 。 这一节会更深入地探讨他们之中的细节,每次都会展示几个匹配的例子。 注意:除了 ident、lifetime 和 tt 分类符之外,其余的分类符在匹配后生成的 AST 是不清楚的 (opaque),这使得在之后的宏调用时不可能检查 (inspect) 捕获的结果。 [2] block expr ident item lifetime literal meta pat pat_param path stmt tt ty vis 最新内容可参考 Reference 的 Metavariables 一节。 推荐通过 rust quiz #9 来理解这句话。","breadcrumbs":"声明宏 » 细节 » 片段分类符 » 片段分类符","id":"27","title":"片段分类符"},"28":{"body":"block 分类符只匹配 block 表达式 。 块 (block) 由 { 开始,接着是一些语句,最后是可选的表达式,然后以 } 结束。 块的类型要么是最后的值表达式类型,要么是 () 类型。 macro_rules! blocks { ($($block:block)*) => ();\n} blocks! { {} { let zig; } { 2 }\n}\nfn main() {}","breadcrumbs":"声明宏 » 细节 » 片段分类符 » block","id":"28","title":"block"},"29":{"body":"expr 分类符用于匹配任何形式的表达式 ( expression )。 (如果把 Rust 视为面向表达式的语言,那么它有很多种表达式。) macro_rules! expressions { ($($expr:expr)*) => ();\n} expressions! { \"literal\" funcall() future.await break 'foo bar\n}\nfn main() {}","breadcrumbs":"声明宏 » 细节 » 片段分类符 » expr","id":"29","title":"expr"},"3":{"body":"在讨论 Rust 的不同宏系统之前,有必要讨论一下构建它们的一般机制:语法扩展 。 要理解这一点,我们必须首先讨论编译器如何处理 Rust 源代码,以及构建用户自定义的宏和过程宏所基于的一般机制。 注意 :本书将从现在开始,讨论 Rust 的所有不同宏类型时,使用术语“语法扩展” (syntax extension),以减少与即将发布的声明宏 2.0 提案的可能存在的混淆,该提案使用了 macro 关键字。","breadcrumbs":"语法拓展 » 语法扩展","id":"3","title":"语法扩展"},"30":{"body":"ident 分类符用于匹配任何形式的标识符 ( identifier ) 或者关键字。 。 macro_rules! idents { ($($ident:ident)*) => ();\n} idents! { // _ <- `_` 不是标识符,而是一种模式 foo async O_________O _____O_____\n}\nfn main() {}","breadcrumbs":"声明宏 » 细节 » 片段分类符 » ident","id":"30","title":"ident"},"31":{"body":"item 分类符只匹配 Rust 的 item 的 定义 (definitions) , 不会匹配指向 item 的标识符 (identifiers)。例子: macro_rules! items { ($($item:item)*) => ();\n} items! { struct Foo; enum Bar { Baz } impl Foo {} /*...*/\n}\nfn main() {} item 是在编译时完全确定的,通常在程序执行期间保持固定,并且可以驻留在只读存储器中。具体指: modules extern crate declarations use declarations function definitions type definitions struct definitions enumeration definitions union definitions constant items static items trait definitions implementations extern blocks","breadcrumbs":"声明宏 » 细节 » 片段分类符 » item","id":"31","title":"item"},"32":{"body":"lifetime 分类符用于匹配生命周期注解或者标签 ( lifetime or label )。 它与 ident 很像,但是 lifetime 会匹配到前缀 '' 。 macro_rules! lifetimes { ($($lifetime:lifetime)*) => ();\n} lifetimes! { 'static 'shiv '_\n}\nfn main() {}","breadcrumbs":"声明宏 » 细节 » 片段分类符 » lifetime","id":"32","title":"lifetime"},"33":{"body":"literal 分类符用于匹配字面表达式 ( literal expression )。 macro_rules! literals { ($($literal:literal)*) => ();\n} literals! { -1 \"hello world\" 2.3 b'b' true\n}\nfn main() {}","breadcrumbs":"声明宏 » 细节 » 片段分类符 » literal","id":"33","title":"literal"},"34":{"body":"meta 分类符用于匹配属性 ( attribute ), 准确地说是属性里面的内容。通常你会在 #[$meta:meta] 或 #![$meta:meta] 模式匹配中 看到这个分类符。 macro_rules! metas { ($($meta:meta)*) => ();\n} metas! { ASimplePath super::man path = \"home\" foo(bar)\n}\nfn main() {} 针对文档注释简单说一句: 文档注释其实是具有 #[doc=\"…\"] 形式的属性,... 实际上就是注释字符串, 这意味着你可以在在宏里面操作文档注释!","breadcrumbs":"声明宏 » 细节 » 片段分类符 » meta","id":"34","title":"meta"},"35":{"body":"pat 分类符用于匹配任何形式的模式 ( pattern ),包括 2021 edition 开始的 or-patterns 。 macro_rules! patterns { ($($pat:pat)*) => ();\n} patterns! { \"literal\" _ 0..5 ref mut PatternsAreNice 0 | 1 | 2 | 3 }\nfn main() {}","breadcrumbs":"声明宏 » 细节 » 片段分类符 » pat","id":"35","title":"pat"},"36":{"body":"从 2021 edition 起, or-patterns 模式开始应用,这让 pat 分类符不再允许跟随 |。 为了避免这个问题或者说恢复旧的 pat 分类符行为,你可以使用 pat_param 片段,它允许 | 跟在它后面,因为 pat_param 不允许 top level 或 or-patterns。 macro_rules! patterns { (pat: $pat:pat) => { println!(\"pat: {}\", stringify!($pat)); }; (pat_param: $($pat:pat_param)|+) => { $( println!(\"pat_param: {}\", stringify!($pat)); )+ };\n}\nfn main() { patterns! { pat: 0 | 1 | 2 | 3 } patterns! { pat_param: 0 | 1 | 2 | 3 }\n} macro_rules! patterns { ($( $( $pat:pat_param )|+ )*) => ();\n} patterns! { \"literal\" _ 0..5 ref mut PatternsAreNice 0 | 1 | 2 | 3 }\nfn main() {}","breadcrumbs":"声明宏 » 细节 » 片段分类符 » pat_param","id":"36","title":"pat_param"},"37":{"body":"path 分类符用于匹配类型中的路径 ( TypePath )。 这包括函数式的 trait 形式。 macro_rules! paths { ($($path:path)*) => ();\n} paths! { ASimplePath ::A::B::C::D G::::C FnMut(u32) -> ()\n}\nfn main() {}","breadcrumbs":"声明宏 » 细节 » 片段分类符 » path","id":"37","title":"path"},"38":{"body":"stmt 分类符只匹配的 语句 ( statement )。 除非 item 语句要求结尾有分号,否则 不会 匹配语句最后的分号。 什么叫 item 语句要求结尾有分号呢?单元结构体 (Unit-Struct) 就是一个简单的例子, 因为它定义中必须带上结尾的分号。 赶紧用例子展示上面说的是啥意思吧。下面的宏只给出它所捕获的内容,因为有几行不能通过编译。 macro_rules! statements { ($($stmt:stmt)*) => ($($stmt)*);\n} fn main() { statements! { struct Foo; fn foo() {} let zig = 3 let zig = 3; 3 3; if true {} else {} {} }\n} 你可以根据报错内容试着删除不能编译的代码,结合 stmt 小节开头的文字再琢磨琢磨。 你如果正浏览使用 mdbook 渲染的页面,那么可以直接运行和修改这段代码。 虽然源代码编译失败,但是我们可以展开宏 [3] , 使用 playground 的 Expand macros 工具 (tool);或者把代码复制到本地,在 nightly Rust 版本中使用 cargo rustc -- -Zunstable-options --pretty=expanded 命令得到宏展开结果: # warning: unnecessary trailing semicolon\n# --> src/main.rs:10:20\n# |\n# 10 | let zig = 3;\n# | ^ help: remove this semicolon\n# |\n# = note: `#[warn(redundant_semicolons)]` on by default\n# # warning: unnecessary trailing semicolon\n# --> src/main.rs:12:10\n# |\n# 12 | 3;\n# | ^ help: remove this semicolon\n# # #![feature(prelude_import)]\n# #[prelude_import]\n# use std::prelude::rust_2018::*;\n# #[macro_use]\n# extern crate std;\n# macro_rules! statements { ($ ($ stmt : stmt) *) => ($ ($ stmt) *) ; } fn main() { struct Foo; fn foo() { } let zig = 3; let zig = 3; ; 3; 3; ; if true { } else { } { }\n} 由此我们知道: 虽然 stmt 分类符没有捕获语句末尾的分号,但它依然在所需的时候返回了 (emit) 语句。原因很简单,分号本身就是有效的语句。所以我们实际输入 10 个语句调用了宏,而不是 8 个!这在把多个反复捕获放入一个反复展开时很重要,因为此时反复的次数必须相同。 在这里你应该注意到:struct Foo; 被匹配到了。否则我们会看到像其他情况一样有一个额外 ; 语句。由前所述,这能想通:item 语句需要分号,所以这个分号能被匹配到。 仅由块表达式或控制流表达式组成的表达式结尾没有分号, 其余的表达式捕获后产生的表达式会尾随一个分号(在这个例子中,正是这里出错)。 这里提到的细节能在 Reference 的 statement 一节中找到。但个细节通常这并不重要,除了要注意反复次数,通常没什么问题。 可阅读 调试 一章","breadcrumbs":"声明宏 » 细节 » 片段分类符 » stmt","id":"38","title":"stmt"},"39":{"body":"tt 分类符用于匹配标记树 (TokenTree)。 如果你是新手,对标记树不了解,那么需要回顾本书 标记树 一节。tt 分类符是最有作用的分类符之一,因为它能匹配几乎所有东西, 而且能够让你在使用宏之后检查 (inspect) 匹配的内容。 这让你可以编写非常强大的宏技巧,比如 tt-muncher 和 push-down-accumulator 。","breadcrumbs":"声明宏 » 细节 » 片段分类符 » tt","id":"39","title":"tt"},"4":{"body":"","breadcrumbs":"语法拓展 » 源代码分析 » 源代码解析方式","id":"4","title":"源代码解析方式"},"40":{"body":"ty 分类符用于匹配任何形式的类型表达式 ( type expression )。 类型表达式是在 Rust 中指代类型的语法。 macro_rules! types { ($($type:ty)*) => ();\n} types! { foo::bar bool [u8] impl IntoIterator\n}\nfn main() {}","breadcrumbs":"声明宏 » 细节 » 片段分类符 » ty","id":"40","title":"ty"},"41":{"body":"vis 分类符会匹配 可能为空 可见性修饰符 ( Visibility qualifier )。 macro_rules! visibilities { // ∨~~注意这个逗号,`vis` 分类符自身不会匹配到逗号 ($($vis:vis,)*) => ();\n} visibilities! { , // 没有 vis 也行,因为 $vis 隐式包含 `?` 的情况 pub, pub(crate), pub(in super), pub(in some_path),\n}\nfn main() {} vis 实际上只支持例子里的几种方式,因为这里的 visibility 指的是可见性,与私有性相对。而涉及这方面的内容只有与 pub 的关键字。所以,vis 在关心匹配输入的内容是公有还是私有时有用。 此外,如果匹配时,其后没有标记流,整个宏会匹配失败: macro_rules! non_optional_vis { ($vis:vis) => ();\n}\nnon_optional_vis!();\n// ^^^^^^^^^^^^^^^^ error: missing tokens in macro arguments\nfn main() {} 重点在于“可能为空”。你可能想到这是隐藏了 ? 重复操作符的分类符,这样你就不用直接在反复匹配时使用 ? —— 其实你不能将它和 ? 一起在重复模式匹配中使用。 可以匹配 $vis:vis $ident:ident,但不能匹配 $(pub)? $ident:ident,因为 pub 表明一个有效的标识符,所以后者是模糊不清的。 macro_rules! vis_ident { ($vis:vis $ident:ident) => ();\n}\nvis_ident!(pub foo); // this works fine macro_rules! pub_ident { ($(pub)? $ident:ident) => ();\n}\npub_ident!(pub foo); // ^^^ error: local ambiguity when calling macro `pub_ident`: multiple parsing options: built-in NTs ident ('ident') or 1 other option.\nfn main() {} 而且,搭配 tt 分类符和递归展开去匹配空标记也会导致有趣而奇怪的事情。 当 pub 匹配了空标记,元变量依然算一次被捕获,又因为它不是 tt、ident 或 lifetime,所以再次展开时是不清楚的。 这意味着如果这种捕获的结果传递给另一个将它视为 tt 的宏调用,你最终得到一棵空的标记树。 macro_rules! it_is_opaque { (()) => { \"()\" }; (($tt:tt)) => { concat!(\"$tt is \", stringify!($tt)) }; ($vis:vis ,) => { it_is_opaque!( ($vis) ); }\n}\nfn main() { // this prints \"$tt is \", as the recursive calls hits the second branch with // an empty tt, opposed to matching with the first branch! println!(\"{}\", it_is_opaque!(,));\n}","breadcrumbs":"声明宏 » 细节 » 片段分类符 » vis","id":"41","title":"vis"},"42":{"body":"","breadcrumbs":"声明宏 » 细节 » 再谈元变量与宏展开 » 再谈元变量与宏展开","id":"42","title":"再谈元变量与宏展开"},"43":{"body":"一旦语法分析器开始消耗标记以匹配某捕获,整个过程便 无法停止或回溯 。 这意味着,无论输入是什么样的,下面这个宏的第二项规则将永远无法被匹配到: macro_rules! dead_rule { ($e:expr) => { ... }; ($i:ident +) => { ... };\n} fn main() { dead_rule!(x+);\n} 考虑当以 dead_rule!(x+) 形式调用此宏时,将会发生什么。 解析器将从第一条规则开始试图进行匹配:它试图将输入解析为一个表达式。 第一个标记 x 作为表达式是有效的,第二个标记——作为二元加符号 + 的节点——在表达式中也是有效的。 由此你可能会以为,由于输入中并不包含二元加号 + 的右侧元素, 分析器将会放弃尝试这一规则,转而尝试下一条规则。 实则不然:分析器将会 panic 并终止整个编译过程,最终返回一个语法错误。 由于分析器的这一特点,下面这点尤为重要: 一般而言,在书写宏规则时, 应从最具体的开始写起,依次写直到最不具体的 。","breadcrumbs":"声明宏 » 细节 » 再谈元变量与宏展开 » 书写宏规则的顺序","id":"43","title":"书写宏规则的顺序"},"44":{"body":"为防止将来的语法变动影响宏输入的解析方式, macro_rules! 对紧接元变量后的内容施加了限制。 在 Rust 1.52 中,能够紧跟片段分类符后面的内容具有如下限制 [1] : stmt 和 expr :=>、,、; 之一 pat :=>、,、=、if、in 之一 [2] [pat_param]:=>、,、=、|、if、in 之一 path 和 ty :=>、,、=、|、;、:、>、>>、[、{、as、where 之一; 或者 block 型的元变量 vis :,、除了 priv 之外的标识符、任何以类型开头的标记、 ident 或 ty 或 path 型的元变量 其他片段分类符所跟的内容无限制 使用 2021 edition 之前的 Rust,pat 依然可以跟随 |。 反复匹配的情况也遵循这些限制 [1] ,也就是说: 如果一个重复操作符(* 或 +)能让一类元变量重复数次, 那么反复出现的内容就是这类元变量,反复结束之后所接的内容遵照上面的限制。 如果一个重复操作符(* 或 ?)让一类元变量重复零次, 那么元变量之后的内容遵照上面的限制。 内容来自于 Reference follow-set-ambiguity-restrictions 一节。","breadcrumbs":"声明宏 » 细节 » 再谈元变量与宏展开 » 片段分类符的跟随限制","id":"44","title":"片段分类符的跟随限制"},"45":{"body":"解析器不会预先运行代码,这意味着如果编译器不能一次就唯一地确定如何解析宏调用, 那么编译器就带着模糊的报错信息而终止运行。 一个触发终止运行的例子是: macro_rules! ambiguity { ($($i:ident)* $i2:ident) => { };\n} // error:\n// local ambiguity: multiple parsing options: built-in NTs ident ('i') or ident ('i2').\nfn main() { ambiguity!(an_identifier); } 编译器不会提前看到传入的标识符之后是不是一个 ),如果提前看到的话就会解析正确。","breadcrumbs":"声明宏 » 细节 » 再谈元变量与宏展开 » 编译器拒绝模糊的规则","id":"45","title":"编译器拒绝模糊的规则"},"46":{"body":"关于代换元变量 (substitution,这里指把已经进行宏解析的 token 再次传给宏) , 常常让人惊讶的一面是,尽管 很像 是根据标记 (token) 进行代换的,但事实并非如此 ——代换基于已经解析的 AST 节点。 思考下面的例子: macro_rules! capture_then_match_tokens { ($e:expr) => {match_tokens!($e)};\n} macro_rules! match_tokens { ($a:tt + $b:tt) => {\"got an addition\"}; (($i:ident)) => {\"got an identifier\"}; ($($other:tt)*) => {\"got something else\"};\n} fn main() { println!(\"{}\\n{}\\n{}\\n\", match_tokens!((caravan)), match_tokens!(3 + 6), match_tokens!(5)); println!(\"{}\\n{}\\n{}\", capture_then_match_tokens!((caravan)), capture_then_match_tokens!(3 + 6), capture_then_match_tokens!(5));\n} 其结果: got an identifier\ngot an addition\ngot something else got something else\ngot something else\ngot something else 通过解析已经传入 AST 节点的输入,代换的结果变得 很稳定 :你再也无法检查其内容了, 也不再匹配内容。 另一个例子可能也会很令人困惑: macro_rules! capture_then_what_is { (#[$m:meta]) => {what_is!(#[$m])};\n} macro_rules! what_is { (#[no_mangle]) => {\"no_mangle attribute\"}; (#[inline]) => {\"inline attribute\"}; ($($tts:tt)*) => {concat!(\"something else (\", stringify!($($tts)*), \")\")};\n} fn main() { println!( \"{}\\n{}\\n{}\\n{}\", what_is!(#[no_mangle]), what_is!(#[inline]), capture_then_what_is!(#[no_mangle]), capture_then_what_is!(#[inline]), );\n} 结果是: no_mangle attribute\ninline attribute\nsomething else (#[no_mangle])\nsomething else (#[inline]) 避免这个意外情况的唯一方式就是使用 tt 、 ident 或者 lifetime 分类符。 每当你捕获到除此之外的分类符,结果将只能被用于直接输出。 比如这里使用的 stringify! [3] ,它是一条内置于编译器的语法拓展 ( 查看源码可知 ), 将所有输入标记结合在一起,作为单个字符串输出。 这里未包含原作对 stringify! 用于替换 (substitution) 场景的 解读 ,因为那个例子的结果有些变化。","breadcrumbs":"声明宏 » 细节 » 再谈元变量与宏展开 » 不基于标记的代换","id":"46","title":"不基于标记的代换"},"47":{"body":"RFC : rfcs#1584 Tracking Issue : rust#83527 Feature : #![feature(macro_metavar_expr)] 注意:示例代码片段非常简单,只试图展示它们是如何工作的。 关于这些元变量表达式,如果你认为你有合适的、单独使用的小片段,请提交它们! 正如在 思路 中提到的,Rust 有一些特殊的元变量表达式(以下简称表达式):transcriber [1] 可以使用这些表达式来获取有关元变量的信息。如果没有这些表达式,它们所提供的信息就很难甚至不可能获得。 本章将结合用例对它们进行更深入的介绍。 $$ ${count(ident, depth)} ${index(depth)} ${length(depth)} ${ignore(ident)} 译者注:在专业的讨论中,尤其涉及元变量表达式,常用 transcribe(r) 一词而不使用 expand (expansion)。","breadcrumbs":"声明宏 » 细节 » 元变量表达式 » 元变量表达式","id":"47","title":"元变量表达式"},"48":{"body":"$$ 表达式展开为单个 $,实际上使其成为转义的 $。这让声明宏宏生成新的声明宏。 因为以前的声明宏将无法转义 $,所以无法使用元变量、重复和元变量表达式。例如以下代码片段中不使用 $$,就无法使用 bar!: macro_rules! foo { () => { macro_rules! bar { ( $( $any:tt )* ) => { $( $any )* }; // ^^^^^^^^^^^ error: attempted to repeat an expression containing no syntax variables matched as repeating at this depth } };\n} foo!();\n# fn main() {} 问题很明显, foo! 的 transcriber 看到有反复捕获的意图,并试图反复捕获,但它的作用域中没有 $any 元变量,这导致它产生错误。有了 $$,我们就可以解决这个问题 [2] ,因为 foo 的 transcriber 不再尝试反复捕获。 #![feature(macro_metavar_expr)] macro_rules! foo { () => { macro_rules! bar { ( $$( $$any:tt )* ) => { $$( $$any )* }; } };\n} foo!();\nbar!();\n# fn main() {} 译者注:在没有 $$ 之前,存在一种技巧绕过这里的问题:你可以使用 $tt 捕获 $ 来进行转义,比如 这样 。","breadcrumbs":"声明宏 » 细节 » 元变量表达式 » Dollar Dollar ($$)","id":"48","title":"Dollar Dollar ($$)"},"49":{"body":"count 表达式展开成元变量 $ident 在给定反复深度的反复次数。 ident 参数必须是规则作用域中声明的元变量 depth 参数必须是值小于或等于元变量 $ident 出现的最大反复深度的整型字面值 count(ident, depth) 展开成不带后缀的整型字面值标记 count(ident) 是 count(ident, 0) 的简写 #![feature(macro_metavar_expr)] macro_rules! foo { ( $( $outer:ident ( $( $inner:ident ),* ) ; )* ) => { println!(\"count(outer, 0): $outer repeats {} times\", ${count($outer)}); println!(\"count(inner, 0): The $inner repetition repeats {} times in the outer repetition\", ${count($inner, 0)}); println!(\"count(inner, 1): $inner repeats {} times in the inner repetitions\", ${count($inner, 1)}); };\n} fn main() { foo! { outer () ; outer ( inner , inner ) ; outer () ; outer ( inner ) ; };\n}","breadcrumbs":"声明宏 » 细节 » 元变量表达式 » count(ident, depth)","id":"49","title":"count(ident, depth)"},"5":{"body":"Rust程序编译过程的第一阶段是 标记解析 。 在这一过程中,源代码将被转换成一系列的标记 (token)。 token:无法被分割的词法单元;在编程语言世界中等价于“单词”。 Rust包含多种标记,比如: 标识符 (identifiers): foo, Bambous, self, we_can_dance, LaCaravane, … 字面值 (literals): 42, 72u32, 0_______0, 1.0e-40, \"ferris was here\", … 关键字 (keywords): _, fn, self, match, yield, macro, … 符号 (symbols): [, :, ::, ?, ~, @ [1] , … 等等 。 有些地方值得注意: self 既是一个标识符又是一个关键词。 几乎在所有情况下它都被视作是一个关键词,但它有可能被视为标识符。 我们稍后会(骂骂咧咧地)提到这种情况。 关键词里列有一些可疑的家伙,比如 yield 和 macro。 它们在当前的Rust语言中并没有任何含义,但编译器的确会把它们视作关键词进行解析。 这些词语被保留作语言未来扩充时使用。 符号里也列有一些未被当前语言使用的条目。比如 <-,这是历史残留: 目前它被移除了Rust语法,但词法分析器仍然没丢掉它。 注意 :: 被视作一个独立的标记,而非两个连续的 : 。 这一规则适用于截至 Rust 1.2 版本的所有的多字符符号标记。 [2] @ 被用在模式中,用来绑定模式非终止的部分到一个名称——但这似乎被大多数人完全地遗忘了。 严格来说, Rust 1.52 版本中存在两个词法分析器 (lexer): rustc_lexer 只将单个字符作为 标记 (tokens); rustc_parse 里的 lexer 把多个字符作为不同的 标记 (tokens)。 作为对比,某些语言的宏系统正扎根于这一阶段。Rust并非如此。 举例来说,从效果来看,C/C++的宏就是在这里得到处理的。 [3] 这也正是下列代码能够运行的原因: [4] #define SUB void\n#define BEGIN {\n#define END } SUB main() BEGIN printf(\"Oh, the horror!\\n\");\nEND 实际上,C 预处理程序使用与 C 自身所不同的词法结构,但这些区别很大程度上无关紧要。 是否应该这样运行完全是一个另外的话题了。","breadcrumbs":"语法拓展 » 源代码分析 » 标识化 (Tokenization)","id":"5","title":"标识化 (Tokenization)"},"50":{"body":"index(depth) 表达式展开为给定反复深度下,当前的迭代索引。 depth 参数表明在第几层反复,这个数字从最内层反复调用表达式开始向外计算 index(depth) 展开成不带后缀的整型字面值标记 index() 是 index(0) 的简写 #![feature(macro_metavar_expr)] macro_rules! attach_iteration_counts { ( $( ( $( $inner:ident ),* ) ; )* ) => { ( $( $(( stringify!($inner), ${index(1)}, // 这指的是外层反复 ${index()} // 这指的是内层反复,等价于 `index(0)` ),)* )* ) };\n} fn main() { let v = attach_iteration_counts! { ( hello ) ; ( indices , of ) ; () ; ( these, repetitions ) ; }; println!(\"{v:?}\");\n}","breadcrumbs":"声明宏 » 细节 » 元变量表达式 » index(depth)","id":"50","title":"index(depth)"},"51":{"body":"length(depth) 表达式展开为在给定反复深度的迭代次数。 depth 参数表示在第几层反复,这个数字从最内层反复调用表达式开始向外计算 length(depth) 展开成不带后缀的整型字面值标记 length() 是 length(0) 的简写 #![feature(macro_metavar_expr)] macro_rules! lets_count { ( $( $outer:ident ( $( $inner:ident ),* ) ; )* ) => { $( $( println!( \"'{}' in inner iteration {}/{} with '{}' in outer iteration {}/{} \", stringify!($inner), ${index()}, ${len()}, stringify!($outer), ${index(1)}, ${len(1)}, ); )* )* };\n} fn main() { lets_count!( many (small , things) ; none () ; exactly ( one ) ; );\n}","breadcrumbs":"声明宏 » 细节 » 元变量表达式 » length(depth)","id":"51","title":"length(depth)"},"52":{"body":"ignore(ident) 表达式展开为空,这使得在无需实际展开元变量的时候,像元变量反复展开相同次数的某些内容。 ident 参数必须是规则作用域中声明的元变量 #![feature(macro_metavar_expr)] macro_rules! repetition_tuples { ( $( ( $( $inner:ident ),* ) ; )* ) => { ($( $( ( ${index()}, ${index(1)} ${ignore($inner)} // without this metavariable expression, compilation would fail ), )* )*) };\n} fn main() { let tuple = repetition_tuples!( ( one, two ) ; () ; ( one ) ; ( one, two, three ) ; ); println!(\"{tuple:?}\");\n}","breadcrumbs":"声明宏 » 细节 » 元变量表达式 » ignore(ident)","id":"52","title":"ignore(ident)"},"53":{"body":"译者注:卫生性 (hygiene) 描述的是 标识符 在宏处理和展开过程中是“宏定义处的标识符不与外部定义的标识符交互”、“不被外部同名标识符污染的”。见 卫生性和 Span 。","breadcrumbs":"声明宏 » 细节 » 宏是部分“卫生的” » 卫生性","id":"53","title":"卫生性"},"54":{"body":"Rust 里的声明宏是 部分 卫生的 (partially hygienic 或者称作 mixed hygiene)。 具体来说,对于以下内容,声明宏是卫生的: 局部变量 (local variables) labels $crate 除此之外,声明宏都不是卫生的。 [1] 推荐尝试 Rust Quiz #24 ,并阅读 “Truly Hygienic” Let Statements in Rust 。 之所以能做到“卫生”,是因为每个标识符都被赋予了一个看不见的“句法上下文” (syntax context)。在比较两个标识符时,只有在标识符的原文名称和句法上下文都 完全一样 的情况下,两个标识符才能被视作等同。 为阐释这一点,考虑下述代码: macro_rules! using_a { ($e:expr) => { { let a = 42; $e } }\n} let four = using_a!(a / 10); 我们将采用背景色来表示句法上下文。现在,将上述宏调用展开如下: let four = { let a = 42; a / 10\n}; 首先,回想一下,在展开的期间调用声明宏,实际是空(因为那是一棵待补全的语法树)。 其次,如果我们现在就尝试编译上述代码,编译器将报如下错误: error[E0425]: cannot find value `a` in this scope --> src/main.rs:13:21 |\n13 | let four = using_a!(a / 10); | ^ not found in this scope 注意到宏在展开后背景色(即其句法上下文)发生了改变。 每处宏展开均赋予其内容一个新的、独一无二的上下文。 故而,在展开后的代码中实际上存在 两个 不同的 a,它们分别有不同的句法上下文。 即,第一个 a 与第二个 a 并不相同,即使它们便看起来很像。 也就是说,被替换进宏展开中的标记仍然 保持 着它们原有的句法上下文。 因为它们是被传给这宏的,并非这宏本身的一部分。因此,我们作出如下修改: macro_rules! using_a { ($a:ident, $e:expr) => { { let $a = 42; $e } }\n} let four = using_a!(a, a / 10); 展开如下: let four = { let a = 42; a / 10\n}; 因为只用了一个 a(显然 a 在此处是局部变量),编译器将欣然接受此段代码。","breadcrumbs":"声明宏 » 细节 » 宏是部分“卫生的” » 宏是部分卫生的","id":"54","title":"宏是部分卫生的"},"55":{"body":"当声明宏需要其定义所在的 (defining) crate 的其他 items 时,由于“卫生性”,我们需要使用 $crate 元变量。 这个特殊的元变量所做的事情是,它展开成宏所定义的 crate 的绝对路径。 //// 在 `helper_macro` crate 里定义 `helped!` 和 `helper!` 宏\n#[macro_export]\nmacro_rules! helped { // () => { helper!() } // 这行可能导致 `helper` 不在作用域的错误 () => { $crate::helper!() }\n} #[macro_export]\nmacro_rules! helper { () => { () }\n} //// 在另外的 crate 中使用这两个宏\n// 注意:`helper_macro::helper` 并没有导入进来\nuse helper_macro::helped; fn unit() { // 这个宏能运行通过,因为 `$crate` 正确地展开成 `helper_macro` crate 的路径(而不是使用者的路径) helped!();\n} 请注意,$crate 用在指明非宏的 items 时,它必须和完整且有效的模块路径一起使用。如下: pub mod inner { #[macro_export] macro_rules! call_foo { () => { $crate::inner::foo() }; } pub fn foo() {}\n}","breadcrumbs":"声明宏 » 细节 » 宏是部分“卫生的” » $crate 元变量","id":"55","title":"$crate 元变量"},"56":{"body":"译者注:这里需要记住的重点是 self 可以使用 ident 或者 tt 分类符来匹配; _ 只能在模式中使用,不能用 ident 分类符匹配,而是用 pat 或者 tt 分类符匹配。 有两个标记,当你最终撞见时,很有可能认为它们是标识符 ( ident ),但实际上它们不是。 然而正是这些标记,在某些情况下又的确是标识符。","breadcrumbs":"声明宏 » 细节 » 非标识符的“标识符” » 非标识符的“标识符”","id":"56","title":"非标识符的“标识符”"},"57":{"body":"第一个是 self。毫无疑问,它是一个 关键词 ( keyword )。在一般的 Rust 代码中,不可能出现把它解读成标识符的情况;但在宏中这种情况则有可能发生: macro_rules! what_is { (self) => {\"the keyword `self`\"}; ($i:ident) => {concat!(\"the identifier `\", stringify!($i), \"`\")};\n} macro_rules! call_with_ident { ($c:ident($i:ident)) => {$c!($i)};\n} fn main() { println!(\"{}\", what_is!(self)); println!(\"{}\", call_with_ident!(what_is(self)));\n} 上述代码的输出将是: the keyword `self`\nthe keyword `self` 但这说不通啊!call_with_ident! 要求一个标识符,而且它的确匹配到了,还成功替换了!所以, self 同时是一个关键词,但又不是。你可能会想,好吧,但这鬼东西哪里重要呢?看看这个: macro_rules! make_mutable { ($i:ident) => {let mut $i = $i;};\n} struct Dummy(i32); impl Dummy { fn double(self) -> Dummy { make_mutable!(self); self.0 *= 2; self }\n} fn main() { println!(\"{:?}\", Dummy(4).double().0);\n} 编译它会失败,并报错: error: `mut` must be followed by a named binding --> src/main.rs:2:24 |\n2 | ($i:ident) => {let mut $i = $i;}; | ^^^^^^ help: remove the `mut` prefix: `self`\n...\n9 | make_mutable!(self); | -------------------- in this macro invocation | = note: `mut` may be followed by `variable` and `variable @ pattern` 所以说,宏在匹配的时候,会欣然把 self 当作标识符接受,进而允许你把 self 带到那些实际上没办法使用的情况中去。但是,也成吧,既然得同时记住 self 既是关键词又是标识符,那下面这个讲道理应该可行,对吧? macro_rules! make_self_mutable { ($i:ident) => {let mut $i = self;};\n} struct Dummy(i32); impl Dummy { fn double(self) -> Dummy { make_self_mutable!(mut_self); mut_self.0 *= 2; mut_self }\n} fn main() { println!(\"{:?}\", Dummy(4).double().0);\n} 实际上也不行,编译错误变成: error[E0424]: expected value, found module `self` --> src/main.rs:2:33 |\n2 | ($i:ident) => {let mut $i = self;}; | ^^^^ `self` value is a keyword only available in methods with a `self` parameter\n...\n8 | / fn double(self) -> Dummy {\n9 | | make_self_mutable!(mut_self); | | ----------------------------- in this macro invocation\n10 | | mut_self.0 *= 2;\n11 | | mut_self\n12 | | } | |_____- this function has a `self` parameter, but a macro invocation can only access identifiers it receives from parameters | 这同样也说不通。这简直就像是在抱怨说,它看见的两个 self 不是同一个 self ... 就搞得像关键词 self 就像标识符一样,也有卫生性。 macro_rules! double_method { ($body:expr) => { fn double(mut self) -> Dummy { $body } };\n} struct Dummy(i32); impl Dummy { double_method! {{ self.0 *= 2; self }}\n} fn main() { println!(\"{:?}\", Dummy(4).double().0);\n} 还是报同样的错。那这个如何: macro_rules! double_method { ($self_:ident, $body:expr) => { fn double(mut $self_) -> Dummy { $body } };\n} struct Dummy(i32); impl Dummy { double_method! {self, { self.0 *= 2; self }}\n} fn main() { println!(\"{:?}\", Dummy(4).double().0);\n} 终于管用了。所以说,self 是关键词,但如果想它变成标识符,那么同时也能是一个标识符。 那么,相同的道理对类似的其它东西有用吗?","breadcrumbs":"声明宏 » 细节 » 非标识符的“标识符” » self","id":"57","title":"self"},"58":{"body":"macro_rules! double_method { ($self_:ident, $body:expr) => { fn double($self_) -> Dummy { $body } };\n} struct Dummy(i32); impl Dummy { double_method! {_, 0}\n} fn main() { println!(\"{:?}\", Dummy(4).double().0);\n} error: no rules expected the token `_` --> src/main.rs:12:21 |\n1 | macro_rules! double_method { | -------------------------- when calling this macro\n...\n12 | double_method! {_, 0} | ^ no rules expected this token in macro call 哈,当然不行。即便它 如同 self 一样从定义上讲是标识符,但 _ 在模式以及表达式中是一个合法的 (valid) 关键词,而不是一个标识符。 你可能觉得,既然 _ 在模式中有效,那换成 $self_:pat 是不是就能一石二鸟了呢? 可惜了,也不行,因为 self 不是一个有效的模式。 如果你真想同时匹配这两个标记,仅有的办法是换用 tt 来匹配。","breadcrumbs":"声明宏 » 细节 » 非标识符的“标识符” » _","id":"58","title":"_"},"59":{"body":"注意:这是一个专门为声明宏量身定做的调试工具清单,调试宏的其他方法可以在语法扩展的 调试 章节中找到。","breadcrumbs":"声明宏 » 细节 » 调试 » 调试","id":"59","title":"调试"},"6":{"body":"编译过程的下一个阶段是语法解析 (parsing)。 这一过程中,一系列的 token 将被转换成一棵抽象语法树 (AST: Abstract Syntax Tree )。 此过程将在内存中建立起程序的语法结构。 举例来说,标记序列 1+2 将被转换成某种类似于: ┌─────────┐ ┌─────────┐\n│ BinOp │ ┌╴│ LitInt │\n│ op: Add │ │ │ val: 1 │\n│ lhs: ◌ │╶┘ └─────────┘\n│ rhs: ◌ │╶┐ ┌─────────┐\n└─────────┘ └╴│ LitInt │ │ val: 2 │ └─────────┘ AST 将包含 整个 程序的结构,但这一结构仅包含词法信息。 举例来讲,在这个阶段编译器虽然可能知道某个表达式提及了某个名为 a 的变量, 但它并 没有办法知道 a 究竟是什么,或者它从哪来。 在 AST 生成之后,宏处理过程才开始。 但在讨论宏处理过程之前,我们需要先谈谈标记树 (token tree)。","breadcrumbs":"语法拓展 » 源代码分析 » 语法解析 (Parsing)","id":"6","title":"语法解析 (Parsing)"},"60":{"body":"最有用的是 trace_macros! ,在每次声明宏展开前,它指示编译器记录下声明宏的调用信息。 例如: # // 注意:这需要 nightly Rust\n#![feature(trace_macros)] macro_rules! each_tt { () => {}; ($_tt:tt $($rest:tt)*) => {each_tt!($($rest)*);};\n} each_tt!(foo bar baz quux);\ntrace_macros!(true);\neach_tt!(spim wak plee whum);\ntrace_macros!(false);\neach_tt!(trom qlip winp xod);\n#\n# fn main() {} 输出为: note: trace_macro --> src/main.rs:11:1 |\n11 | each_tt!(spim wak plee whum); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: expanding `each_tt! { spim wak plee whum }` = note: to `each_tt ! (wak plee whum) ;` = note: expanding `each_tt! { wak plee whum }` = note: to `each_tt ! (plee whum) ;` = note: expanding `each_tt! { plee whum }` = note: to `each_tt ! (whum) ;` = note: expanding `each_tt! { whum }` = note: to `each_tt ! () ;` = note: expanding `each_tt! { }` = note: to `` 它在调试递归很深的宏时尤其有用。 此外,你可以在命令行里,给编译指令附加 -Z trace-macros 来打印追踪的宏。 trace_macros!(false); 之后的宏不会被这个附加指令追踪到,所以这里会追踪前两个宏。 参考命令:cargo rustc --bin binary_name -- -Z trace-macros","breadcrumbs":"声明宏 » 细节 » 调试 » trace_macros!","id":"60","title":"trace_macros!"},"61":{"body":"另一有用的宏是 log_syntax! 。它将使得编译器输出所有经过编译器处理的标记。 比如让编译器“唱首歌”: # // 注意:这需要 nightly Rust\n#![feature(log_syntax)] macro_rules! sing { () => {}; ($tt:tt $($rest:tt)*) => {log_syntax!($tt); sing!($($rest)*);};\n} sing! { ^ < @ < . @ * '\\x08' '{' '\"' _ # ' ' - @ '$' && / _ % ! ( '\\t' @ | = > ; '\\x08' '\\'' + '$' ? '\\x7f' , # '\"' ~ | ) '\\x07'\n}\n#\n# fn main() {} 比起 trace_macros! 来说,它能够做一些更有针对性的调试。","breadcrumbs":"声明宏 » 细节 » 调试 » log_syntax!","id":"61","title":"log_syntax!"},"62":{"body":"另一个很棒的工具是 lukaslueg 编写的 macro_railroad lib。 它能可视化地生成 Rust macro_rules! 宏的语法图 (syntax diagrams)。 它还有一个 浏览器插件 ,和一个可动态可视化声明宏的 静态网页 。","breadcrumbs":"声明宏 » 细节 » 调试 » macro_railroad lib","id":"62","title":"macro_railroad lib"},"63":{"body":"这部分最新的内容可参考 Reference 的 scoping-exporting-and-importing 一节。部分翻译内容引自 Reference 中文版 。 函数式宏的作用域规则可能有一点反直觉。(函数式宏包括声明宏与函数式过程宏。) 由于历史原因,宏的作用域并不完全像各种程序项那样工作。 有两种形式的作用域:文本作用域 (textual scope) 和 基于路径的作用域 (path-based scope)。 文本作用域:基于宏在源文件中(定义和使用所)出现的顺序,或是跨多个源文件出现的顺序, 文本作用域是默认的作用域。 基于路径的作用域:与其他程序项作用域的运行方式相同。 当声明宏被 非限定标识符(unqualified identifier,非多段路径段组成的限定性路径)调用时, 会首先在文本作用域中查找。 如果文本作用域中没有任何结果,则继续在基于路径的作用域中查找。 如果宏的名称由路径限定 (qualified with a path) ,则只在基于路径的作用域中查找。","breadcrumbs":"声明宏 » 细节 » 作用域 » 作用域","id":"63","title":"作用域"},"64":{"body":"","breadcrumbs":"声明宏 » 细节 » 作用域 » 文本作用域","id":"64","title":"文本作用域"},"65":{"body":"与 Rust 语言其余所有部分都不同的是,函数式宏在子模块中仍然可见。 macro_rules! X { () => {}; }\nmod a { X!(); // defined\n}\nmod b { X!(); // defined\n}\nmod c { X!(); // defined\n}\n# fn main() {} 注意:即使子模组的内容处在不同文件中,这些例子中所述的行为仍然保持不变。","breadcrumbs":"声明宏 » 细节 » 作用域 » 宏在子模块中可见","id":"65","title":"宏在子模块中可见"},"66":{"body":"同样与 Rust 语言其余所有部分不同,宏只有在其定义 之后 可见。 下例展示了这一点。同时注意到,它也展示了宏不会“漏出” (leak) 其定义所在的作用域: mod a { // X!(); // undefined\n}\nmod b { // X!(); // undefined macro_rules! X { () => {}; } X!(); // defined\n}\nmod c { // X!(); // undefined\n}\n# fn main() {} 要清楚,即使你把宏移动到外层作用域,词法依赖顺序的规则依然适用。 mod a { // X!(); // undefined\n} macro_rules! X { () => {}; } mod b { X!(); // defined\n}\nmod c { X!(); // defined\n}\n# fn main() {}","breadcrumbs":"声明宏 » 细节 » 作用域 » 宏在定义之后可见","id":"66","title":"宏在定义之后可见"},"67":{"body":"然而对于宏自身来说,这种具有顺序的依赖行为不存在。 即被调用的宏可以先于调用宏之前声明: mod a { // X!(); // undefined\n} macro_rules! X { () => { Y!(); }; } // 注意这里的代码运行通过 mod b { // 注意这里 X 虽然被定义,但是 Y 不被定义,所以不能使用 X // X!(); // defined, but Y! is undefined } macro_rules! Y { () => {}; } mod c { X!(); // defined, and so is Y!\n}\n# fn main() {}","breadcrumbs":"声明宏 » 细节 » 作用域 » 宏与宏之间顺序无关","id":"67","title":"宏与宏之间顺序无关"},"68":{"body":"允许多次定义 macro_rules! 宏,最后声明的宏会简单地覆盖 (shadow) 上一个声明的同名宏; 如果最后声明的宏离开作用域,上一个宏在有效的作用域内还能被使用。 macro_rules! X { (1) => {}; }\nX!(1);\nmacro_rules! X { (2) => {}; }\n// X!(1); // Error: no rule matches `1`\nX!(2); mod a { macro_rules! X { (3) => {}; } // X!(2); // Error: no rule matches `2` X!(3);\n}\n// X!(3); // Error: no rule matches `3`\nX!(2); fn main() { }","breadcrumbs":"声明宏 » 细节 » 作用域 » 宏可以被暂时覆盖","id":"68","title":"宏可以被暂时覆盖"},"69":{"body":"这个属性放置在宏定义所在的模块前 或者 extern crate 语句前。 在模块前加上 #[macro_use] 属性:导出该模块内的所有宏, 从而让导出的宏在所定义的模块结束之后依然可用。 mod a { // X!(); // undefined\n} #[macro_use]\nmod b { macro_rules! X { () => {}; } X!(); // defined\n} mod c { X!(); // defined\n}\n# fn main() {} 注意,这可能会产生一些奇怪的后果,因为宏(包括过程宏)中的标识符只有在宏展开的过程中才会被解析。 mod a { // X!(); // undefined\n} #[macro_use]\nmod b { macro_rules! X { () => { Y!(); }; } // X!(); // defined, but Y! is undefined\n} macro_rules! Y { () => {}; } mod c { X!(); // defined, and so is Y!\n}\n# fn main() {} 给 extern crate 语句加上 #[macro_use] 属性: 把外部 crate 定义且导出的宏引入当前 crate 的根/顶层模块。(当前 crate 使用外部 crate) 假设在外部名称为 mac 的 crate 中定义了 X! 宏,在当前模块: //// 这里的 `X!` 与 `Y!` 无关,前者定义于外部 crate,后者定义于当前 crate mod a { // X!(); // defined, but Y! is undefined\n} macro_rules! Y { () => {}; } mod b { X!(); // defined, and so is Y!\n} #[macro_use] extern crate macs;\nmod c { X!(); // defined, and so is Y!\n} # fn main() {}","breadcrumbs":"声明宏 » 细节 » 作用域 » #[macro_use] 属性","id":"69","title":"#[macro_use] 属性"},"7":{"body":"标记树是介于 标记 (token) 与 AST 之间的东西。 首先明确一点,几乎所有标记都构成标记树。 具体来说,它们可被看作标记树叶节点。 还有另一类事物也可被看作标记树叶节点,我们将在稍后提到它。 仅有的一种基础标记不是标记树叶节点——“分组”标记:(...), [...] 和 {...}。 这三者属于标记树内的节点,正是它们给标记树带来了树状的结构。 给个具体的例子,这列标记: a + b + (c + d[0]) + e 将被解析为这样的标记树: «a» «+» «b» «+» «( )» «+» «e» ╭────────┴──────────╮ «c» «+» «d» «[ ]» ╭─┴─╮ «0» 注意它跟最后生成的 AST 并 没有关联 。 AST 将仅有一个根节点,而这棵标记树有 七 个。 作为参考,最后生成的 AST 应该是这样: ┌─────────┐ │ BinOp │ │ op: Add │ ┌╴│ lhs: ◌ │\n┌─────────┐ │ │ rhs: ◌ │╶┐ ┌─────────┐\n│ Var │╶┘ └─────────┘ └╴│ BinOp │\n│ name: a │ │ op: Add │\n└─────────┘ ┌╴│ lhs: ◌ │ ┌─────────┐ │ │ rhs: ◌ │╶┐ ┌─────────┐ │ Var │╶┘ └─────────┘ └╴│ BinOp │ │ name: b │ │ op: Add │ └─────────┘ ┌╴│ lhs: ◌ │ ┌─────────┐ │ │ rhs: ◌ │╶┐ ┌─────────┐ │ BinOp │╶┘ └─────────┘ └╴│ Var │ │ op: Add │ │ name: e │ ┌╴│ lhs: ◌ │ └─────────┘ ┌─────────┐ │ │ rhs: ◌ │╶┐ ┌─────────┐ │ Var │╶┘ └─────────┘ └╴│ Index │ │ name: c │ ┌╴│ arr: ◌ │ └─────────┘ ┌─────────┐ │ │ ind: ◌ │╶┐ ┌─────────┐ │ Var │╶┘ └─────────┘ └╴│ LitInt │ │ name: d │ │ val: 0 │ └─────────┘ └─────────┘ 理解 AST 与 标记树 (token tree) 之间的区别至关重要。 写宏时,你将同时与这两者打交道。 还有一条需要注意: 不可能 出现不匹配的小/中/大括号,也不可能存在包含错误嵌套结构的标记树。","breadcrumbs":"语法拓展 » 源代码分析 » 标记树 (Token Trees)","id":"7","title":"标记树 (Token Trees)"},"70":{"body":"前四条作用域规则同样适用于函数。 至于第五条规则, #[macro_use] 属性并不直接作用于函数。 macro_rules! X { () => { Y!() };\n} fn a() { macro_rules! Y { () => {\"Hi!\"} } assert_eq!(X!(), \"Hi!\"); { assert_eq!(X!(), \"Hi!\"); macro_rules! Y { () => {\"Bye!\"} } assert_eq!(X!(), \"Bye!\"); } assert_eq!(X!(), \"Hi!\");\n} fn b() { macro_rules! Y { () => {\"One more\"} } assert_eq!(X!(), \"One more\");\n}\n# # fn main() {\n# a();\n# b();\n# }","breadcrumbs":"声明宏 » 细节 » 作用域 » 当宏放在函数内","id":"70","title":"当宏放在函数内"},"71":{"body":"由于前述种种规则,一般来说, 建议将所有应对整个 crate 均可见的宏的定义置于根模块的最顶部, 借以确保它们 一直 可用。 这个建议和适用于在文件 mod 定义的宏: #[macro_use]\nmod some_mod_that_defines_macros;\nmod some_mod_that_uses_those_macros; 这里的顺序很重要,因为第二个模块依赖于第一个模块的宏, 所以改变这两个模块的顺序会无法编译。","breadcrumbs":"声明宏 » 细节 » 作用域 » 关于宏声明的位置","id":"71","title":"关于宏声明的位置"},"72":{"body":"Rust 的 macro_rules! 宏 默认并没有基于路径的作用域。 然而,如果这个宏被加上 #[macro_export] 属性,那么它就在 crate 的根作用域里被定义, 而且能直接使用它。 导入/导出宏 一章会更深入地探讨这个属性。","breadcrumbs":"声明宏 » 细节 » 作用域 » 基于路径的作用域","id":"72","title":"基于路径的作用域"},"73":{"body":"在 Rust 的 2015 和 2018 版本中,导入 macro_rules! 宏是不一样的。 仍然建议阅读这两部分,因为 2018 版使用的结构在 2015 版中做出了解释。","breadcrumbs":"声明宏 » 细节 » 导入/导出宏 » 导入/导出","id":"73","title":"导入/导出"},"74":{"body":"","breadcrumbs":"声明宏 » 细节 » 导入/导出宏 » 2015 版本","id":"74","title":"2015 版本"},"75":{"body":"作用域 一章中介绍的 #[macro_use] 属性 适用于模块或者 external crates 。例如: #[macro_use]\nmod macros { macro_rules! X { () => { Y!(); } } macro_rules! Y { () => {} }\n} X!();\n#\n# fn main() {}","breadcrumbs":"声明宏 » 细节 » 导入/导出宏 » #[macro_use]","id":"75","title":"#[macro_use]"},"76":{"body":"可通过 #[macro_export] 将宏从当前crate导出。注意,这种方式 无视 所有可见性设定。 定义 lib 包 macs 如下: mod macros { #[macro_export] macro_rules! X { () => { Y!(); } } #[macro_export] macro_rules! Y { () => {} }\n} // X! 和 Y! 并非在此处定义的,但它们 **的确** 被导出了(在此处可用)\n// 即便 `macros` 模块是私有的 下面(在使用 macs lib 的 crate 中)的代码会正常工作: X!(); // X 在当前 crate 中被定义\n#[macro_use] extern crate macs; // 从 `macs` 中导入 X\nX!(); // 这里的 X 是最新声明的 X,即 `macs` crate 中导入的 X\n# # fn main() {} 正如 作用域 一章所说,#[macro_use] 作用于 extern crate 时, 会强制把导出的宏提到 crate 的顶层模块(根模块),所以这里无须使用 macs::macros 路径。 注意:只有在根模组中,才可将 #[macro_use] 用于 extern crate。 在从 extern crate 导入宏时,可显式控制导入 哪些 宏。 从而利用这一特性来限制命名空间污染,或是覆盖某些特定的宏。就像这样: // 只导入 `X!` 这一个宏\n#[macro_use(X)] extern crate macs; // X!(); // X! 已被定义,但 Y! 未被定义。X 与 Y 无关系。 macro_rules! Y { () => {} } X!(); // X 和 Y 都被定义 fn main() {} 当导出宏时,常常出现的情况是,宏定义需要其引用所在 crate 内的非宏符号。 由于 crate 可能被重命名等,我们可以使用一个特殊的替换变量 $crate 。 它总将被扩展为宏定义所在的 crate 的绝对路径(比如 :: macs )。 如果你的编译器版本小于 1.30(即 2018 版之前),那么这招并不适用于宏。 也就是说,你没办法采用类似 $crate::Y! 的代码来引用自己 crate 里的定义的宏。 这表示结合 #[macro_use] 来选择性导入会无法保证某个名称的宏在另一个 crate 导入同名宏时依然可用。 推荐的做法是,在引用非宏名称时,总是采用绝对路径。 这样可以最大程度上避免冲突,包括跟标准库中名称的冲突。","breadcrumbs":"声明宏 » 细节 » 导入/导出宏 » #[macro_export]","id":"76","title":"#[macro_export]"},"77":{"body":"2018 版本让使用 macro_rules! 宏更简单。 因为新版本设法让 Rust 中某些特殊的东西更像正常的 items 。 这意味着我们能以命名空间的方式正确导入和使用宏! 因此,不必使用 #[macro_use] 来导入 来自 extern crate 导出的宏 到全局命名空间, 现在我们这样做就好了: use some_crate::some_macro; fn main() { some_macro!(\"hello\"); // as well as some_crate::some_other_macro!(\"macro world\");\n} 可惜,这只适用于导入外部 crate 的宏; 如果你使用在自己 crate 定义的 macro_rules! 宏, 那么依然需要把 #[macro_use] 添加到宏所定义的模块上来引入模块里面的宏。 因而 作用域规则 就像之前谈论的那样生效。 $crate 前缀(元变量)在 2018 版中可适用于任何东西, 在 1.31 版之后,宏 和类似 item 的东西都能用 $crate 导入了。","breadcrumbs":"声明宏 » 细节 » 导入/导出宏 » 2018 版本","id":"77","title":"2018 版本"},"78":{"body":"RFC : rfcs#1584 Tracking Issue : rust#39412 Feature : #![feature(decl_macro)] 虽然这还未稳定(或者更确切地说,还远未完成),但有人提议建立一个新的声明宏系统,该系统应该取代 macro_rules!,并给其取名为声明宏 2.0、macro、decl_macro 或者更混乱的名称 macros-by-example。 本章只是为了快速浏览当前状态,展示如何使用这个宏系统以及它的不同之处。 这里所描述的一切都不是最终成型的或完整的,因为它们可能会发生变化。","breadcrumbs":"声明宏 » 细节 » macro 2.0 » 声明宏 2.0","id":"78","title":"声明宏 2.0"},"79":{"body":"我们将对前几章中实现的两个宏在 macro 和 macro_rules 的语法之间进行比较: #![feature(decl_macro)] macro_rules! replace_expr_ { ($_t:tt $sub:expr) => { $sub }\n}\nmacro replace_expr($_t:tt $sub:expr) { $sub\n} macro_rules! count_tts_ { () => { 0 }; ($odd:tt $($a:tt $b:tt)*) => { (count_tts!($($a)*) << 1) | 1 }; ($($a:tt $even:tt)*) => { count_tts!($($a)*) << 1 };\n}\nmacro count_tts { () => { 0 }, ($odd:tt $($a:tt $b:tt)*) => { (count_tts!($($a)*) << 1) | 1 }, ($($a:tt $even:tt)*) => { count_tts!($($a)*) << 1 },\n} fn main() {} 它们看起来非常相似,只是有一些不同之处,而且 macro 有两种不同的形式。 让我们先看 count_tts 宏,因为它看起来更像我们习惯看到的样子。虽然它看起来与 macro_rules 的版本几乎相同,但有两个不同之处: 它使用了 macro 关键字 规则分隔符是 , 而不是 ; 不过,macro 还有另一种形式,这是只有一条规则的宏的简写。通过 replace_expr,我们看到,可以用一种更类似于普通函数的方式来编写定义: 直接在宏名字后面编写 matcher 然后去掉一对大括号和 =>,再写 transcriber 调用 macro 所定义的宏,和函数式宏的语法相同,名称后跟 !,再后跟宏输入标记树。","breadcrumbs":"声明宏 » 细节 » macro 2.0 » 语法","id":"79","title":"语法"},"8":{"body":"译者注:牢记“宏”是声明宏和过程宏的统称,而“宏”只是一种“语法拓展”。AST 中的宏其实围绕着标记树。 如前所述,在 Rust 中,宏处理发生 在 AST 生成之后 。因此,调用宏的语法 必须 符合 Rust 语法的一部分。 实际上,Rust 语法包含数种“语法扩展”的形式。具体来说有以下四种(顺便给出例子): # [ $arg ] 形式:比如 #[derive(Clone)], #[no_mangle], … # ! [ $arg ] 形式:比如 #![allow(dead_code)], #![crate_name=\"blang\"], … $name ! $arg 形式:比如 println!(\"Hi!\"), concat!(\"a\", \"b\"), … $name ! $arg0 $arg1 形式:比如 macro_rules! dummy { () => {}; }. 头两种形式被称作“属性” ( attributes )。属性用来给条目 (items) 、表达式、语句加上注解。属性有三类: 内置的属性 ( built-in attributes ) 过程宏属性 ( proc-macro attributes ) 派生属性 ( derive attributes ) 内置的属性由编译器实现。过程宏属性和派生属性在 Rust 第二类宏系统 —— 过程宏 ( procedural macros ) —— 中实现。 我们感兴趣的是第 3 种:$name ! $arg —— 函数式 (function-like) 的宏。这种形式的宏可以通过 macro_rules!、 macro 和过程宏三种方式来使用(或者说定义)。 注意第 3 种形式的函数式宏是一种一般的语法拓展形式,并非仅用 macro_rules! 写出。 比如 format! 是一个 macro_rules! 宏,而用来实现 format! 的 format_args! 不是这里谈论的宏(因为它由编译器实现,是内置的属性)。 第四种形式本质上是宏的变种。其实,这种形式的唯一用例只有 macro_rules!。 所以,请将注意力集中到第 3 种形式 $name ! $arg 上,我们的问题变成,对于每种可能的语法扩展, Rust 的语法解析器 (parser) 如何知道这里的 $arg 究竟长什么样? 答案是它 不需要 知道。其实,提供给语法扩展调用的参数只是 一棵 标记树 (token tree)。 具体来说,是一棵 非叶节点 (non-leaf) 的标记树:即 (...)、[...] 或 {...}。 知道这一点后,语法解析器如何理解如下调用形式,就变得显而易见了: bitflags! { struct Color: u8 { const RED = 0b0001, const GREEN = 0b0010, const BLUE = 0b0100, const BRIGHT = 0b1000, }\n} lazy_static! { static ref FIB_100: u32 = { fn fib(a: u32) -> u32 { match a { 0 => 0, 1 => 1, a => fib(a-1) + fib(a-2) } } fib(100) };\n} fn main() { use Color::*; let colors = vec![RED, GREEN, BLUE]; println!(\"Hello, World!\");\n} 虽然上述调用 看起来 包含了各式各样的 Rust 代码,但对语法解析器来说,它们仅仅是堆无实际意义的标记树。 为了说明问题,我们把所有这些句法“黑盒”用 ⬚ 代替,仅剩下: bitflags! ⬚ lazy_static! ⬚ fn main() { let colors = vec! ⬚; println! ⬚;\n} 再次重申,语法解析器对 ⬚ 不作任何假设;它记录黑盒所包含的标记,但并不尝试理解它们。 这意味着 ⬚ 可以是任何东西,甚至是无效的 Rust 语法。至于为什么这是好事,等会会谈到。 那么,这是否也适用于形式 1 和 2 中的 $arg,以及 4 中的两个参数的情况呢? 有点类似。形式 1 和 2 的 $arg 略有不同,因为它不是直接的标记树,而是后跟 = 标记加字符串表达式或标记树的 简单路径 。过程宏一章将更深入地探讨这一点。这里的重点是,该形式也使用标记树来描述输入。 第 4 种形式通常更特殊,它接受一种非常具体的语法,但这种语法也利用了标记树。这个形式下的具体情况在此处并不重要, 所以在涉及到它之前,暂时跳过它。 以下几点很重要: Rust 包含多种语法扩展。 当遇见形如 $name! $arg 的结构时,它可能是其它语法扩展,比如 macro_rules! 宏、过程宏甚至内置宏。 所有 ! 宏(即第 3 种形式)的输入都是非叶节点的单个标记树。 语法扩展都将作为抽象语法树 (AST) 的 一部分 被解析。 最后一点最为重要,它带来了一些深远的影响。由于语法拓展将被解析进 AST 中,它们 只能 出现在那些明确支持它们出现的位置。具体来说,语法拓展能在如下位置出现: 模式 (pattern) 语句 (statement) 表达式 (expression) 条目 (item) (包括 impl 块) 类型 一些并不支持的位置包括: 标识符 (identifier) match 分支 结构体的字段 在上述第一个列表(支持的位置)之外,绝对没有任何地方有使用语法拓展的可能。","breadcrumbs":"语法拓展 » AST 中的宏 » AST 中的宏","id":"8","title":"AST 中的宏"},"80":{"body":"macro_rules 宏是按文本限定范围的,并且如果将它视为条目,需要 #[macro_export] (而且还可能需要重导出),但 macro 与此不同,因为 macro 宏的行为与规范的条目一样。 因此,你可以使用诸如 pub、pub(crate)、pub(in path) 之类的可见性分类符来适当地限定它们。 [1] 译者注:这也意味着,macro 宏的导入导出规则符合常规条目。","breadcrumbs":"声明宏 » 细节 » macro 2.0 » macro 是规范的条目","id":"80","title":"macro 是规范的条目"},"81":{"body":"到目前为止,卫生性是这两个声明宏系统之间最大的区别。 与具有混合式卫生性 ( mixed site hygiene ) 的 macro_rules 不同,macro 具有定义处卫生性 ( definition site hygiene ),这意味着 macro 不会将标识符泄漏到其调用之外。 这样,下面的代码可以使用 macro_rules 宏进行编译,但无法使用 macro 定义: #![feature(decl_macro)]\n// 试着注释下面第一行,然后取消注释下面第二行,看看会发生什么 macro_rules! foo {\n// macro foo { ($name: ident) => { pub struct $name; impl $name { pub fn new() -> $name { $name } } }\n} foo!(Foo); fn main() { // this fails with a `macro`, but succeeds with a `macro_rules` let foo = Foo::new();\n} 未来可能会有计划允许标识符卫生性逃逸 (hygiene bending)。","breadcrumbs":"声明宏 » 细节 » macro 2.0 » 卫生性","id":"81","title":"卫生性"},"82":{"body":"解析和展开模式。","breadcrumbs":"声明宏 » 模式 » 模式","id":"82","title":"模式"},"83":{"body":"macro_rules! call_with_larch { ($callback:ident) => { $callback!(larch) };\n} macro_rules! expand_to_larch { () => { larch };\n} macro_rules! recognize_tree { (larch) => { println!(\"#1, the Larch.\") }; (redwood) => { println!(\"#2, the Mighty Redwood.\") }; (fir) => { println!(\"#3, the Fir.\") }; (chestnut) => { println!(\"#4, the Horse Chestnut.\") }; (pine) => { println!(\"#5, the Scots Pine.\") }; ($($other:tt)*) => { println!(\"I don't know; some kind of birch maybe?\") };\n} fn main() { recognize_tree!(expand_to_larch!()); // 无法直接使用 `expand_to_larch!` 的展开结果 call_with_larch!(recognize_tree); // 回调就是给另一个宏传入宏的名称 (`ident`),而不是宏的结果\n} // 打印结果:\n// I don't know; some kind of birch maybe?\n// #1, the Larch. 由于宏展开的机制限制,(至少在最新的 Rust 中) 不可能做到把一例宏的展开结果作为有效信息提供给另一例宏。 这为宏的模块化工作施加了难度。 使用递归并传递回调 (callbacks) 是条出路。 作为演示,上例两处宏调用的展开过程如下: recognize_tree! { expand_to_larch ! ( ) }\nprintln! { \"I don't know; some kind of birch maybe?\" }\n// ... call_with_larch! { recognize_tree }\nrecognize_tree! { larch }\nprintln! { \"#1, the Larch.\" }\n// ... 可以反复匹配 tt 来将任意参数转发给回调: macro_rules! callback { ($callback:ident( $($args:tt)* )) => { $callback!( $($args)* ) };\n} fn main() { callback!(callback(println(\"Yes, this *was* unnecessary.\")));\n} 如果需要的话,当然还可以在参数中增加额外的标记 (tokens) 。","breadcrumbs":"声明宏 » 模式 » 回调 » 回调","id":"83","title":"回调"},"84":{"body":"译者注:原文标题为 incremental TT muncher 。 macro_rules! mixed_rules { () => {}; (trace $name:ident; $($tail:tt)*) => { { println!(concat!(stringify!($name), \" = {:?}\"), $name); mixed_rules!($($tail)*); } }; (trace $name:ident = $init:expr; $($tail:tt)*) => { { let $name = $init; println!(concat!(stringify!($name), \" = {:?}\"), $name); mixed_rules!($($tail)*); } };\n}\n# # fn main() {\n# let a = 42;\n# let b = \"Ho-dee-oh-di-oh-di-oh!\";\n# let c = (false, 2, 'c');\n# mixed_rules!(\n# trace a;\n# trace b;\n# trace c;\n# trace b = \"They took her where they put the crazies.\";\n# trace b;\n# );\n# } 此模式可能是 最强大 的宏解析技巧。通过使用它,一些极其复杂的语法都能得到解析。 “标记树撕咬机” (TT muncher) 是一种递归宏,其工作机制有赖于对输入的顺次、逐步处理 (incrementally processing) 。处理过程的每一步中,它都将匹配并移除(“撕咬”掉)输入头部 (start) 的一列标记 (tokens),得到一些中间结果,然后再递归地处理输入剩下的尾部。 名称中含有“标记树”,是因为输入中尚未被处理的部分总是被捕获在 $($tail:tt)* 的形式中。之所以如此,是因为只有通过使用反复匹配 tt 才能做到 无损地 (losslessly) 捕获住提供给宏的输入部分。 标记树撕咬机仅有的限制,也是整个宏系统的局限: 你只能匹配 macro_rules! 捕获到的字面值和语法结构。 你无法匹配不成对的标记组 (unbalanced group) 。 然而,需要把宏递归的局限性纳入考量。macro_rules! 没有做任何形式的尾递归消除或优化。 在写标记树撕咬机时,建议多花些功夫,尽可能地限制递归调用的次数。 以下两种做法帮助你做到限制宏递归: 对于输入的变化,增加额外的匹配规则(而不是采用中间层并使用递归) [1] ; 对输入句法施加限制,以便于记录追踪标准式的反复匹配。 例子见 计数-递归","breadcrumbs":"声明宏 » 模式 » tt “撕咬机“ » 增量式 TT “撕咬机”","id":"84","title":"增量式 TT “撕咬机”"},"85":{"body":"译者注:要点是 可以一次处理很多标记来减少递归次数(比如运用反复匹配) 可以编写规则简单的宏,然后多次调用 把容易匹配到的规则放到前面,以减少匹配次数(因为规则顺序决定了匹配顺序) TT 撕咬机天生就是二次复杂度的。考虑一个 TT 撕咬机 规则,它消耗一个标记树,然后递归地在其余输入上调用自身。如果向其传递 100 个标记树: 初始调用将匹配所有的 100 个标记树。 第 1 个递归调用将匹配 99 个标记树。 下一次递归调用将匹配 98 个标记树。 依此类推,直到匹配最后 1 个标记树。 这是一个典型的二次复杂度模式,过长的输入会导致宏展开延长编译时间。 因此,尽量避免过多地使用 TT 撕咬机,特别是在输入较长的情况下。 recursion_limit 属性的缺省值 (目前是 128 ) 是一个良好的健全性检查;如果你必须超过它,那么可能会遇到麻烦。 建议是,你可以选择编写一个: 一次调用就能处理多件事情的 TT 撕咬机 或者多次调用来处理一件事情的更简单的宏(这种宏从性能角度看,是更推荐的做法) 例如,别这样写: # macro_rules! f { ($($tt:tt)*) => {} }\nf! { fn f_u8(x: u32) -> u8; fn f_u16(x: u32) -> u16; fn f_u32(x: u32) -> u32; fn f_u64(x: u64) -> u64; fn f_u128(x: u128) -> u128;\n} 应该这样写: # macro_rules! f { ($($tt:tt)*) => {} }\nf! { fn f_u8(x: u32) -> u8; }\nf! { fn f_u16(x: u32) -> u16; }\nf! { fn f_u32(x: u32) -> u32; }\nf! { fn f_u64(x: u64) -> u64; }\nf! { fn f_u128(x: u128) -> u128; } 宏的输入越长,第二种编写方式就越有可能缩短编译时间。 此外,如果 TT 撕咬机有许多规则,请 尽可能把最频繁匹配的规则放到前面 。这避免了不必要的匹配失败。(事实上,这对任何类型的声明性宏都是很好的建议,而不仅仅是 TT 撕咬机。) 最后,优先使用正常的反复匹配(* 或 +)来编写宏,这比 TT 撕咬机更好。如果每次调用 TT 撕咬机时,一次只处理一个标记,则最有可能出现这种情况。 在更复杂的情况下,可以参考 quote! 使用的一种高级技术,它可以避免二次复杂度,而且不会达到递归上限,但代价是一些复杂的概念。详情请参考 此处 。","breadcrumbs":"声明宏 » 模式 » tt “撕咬机“ » 性能建议","id":"85","title":"性能建议"},"86":{"body":"#[macro_export]\nmacro_rules! foo { (@as_expr $e:expr) => {$e}; ($($tts:tt)*) => { foo!(@as_expr $($tts)*) };\n}\n# # fn main() {\n# assert_eq!(foo!(42), 42);\n# } 内用规则可用在以下两种情况: 将多个宏统一为一个; 通过显式命名宏中调用的规则,来简化 TT “撕咬机” 的读写。 那么为什么将多个宏统一为一个有用呢? 主要原因是:在 2015 版本中,未对宏进行空间命名。这导致一个问题——必须重新导出内部定义的所有宏, 从而污染整个全局宏命名空间;更糟糕的是,宏与其他 crate 的同名宏发生冲突。 简而言之,这很造成很多麻烦。 幸运的是,在 rustc版本 >= 1.30 的情况下(即 2018 版本之后), 这不再是问题了(但是内用规则可以减少不必要声明的宏), 有关宏导出更多信息,请参阅本书 导入/导出宏 。 好了,让我们讨论如何利用“内用规则” (internal rules) 来把多个宏统一为一个, 以及“内用规则”这项技术到底是什么吧。 这个例子有两个宏,一个常见的 as_expr! 宏 和 foo! 宏,后者使用了前者。如果分开写就是下面的形式: #[macro_export]\nmacro_rules! as_expr { ($e:expr) => {$e} } #[macro_export]\nmacro_rules! foo { ($($tts:tt)*) => { as_expr!($($tts)*) };\n}\n# # fn main() {\n# assert_eq!(foo!(42), 42);\n# } 这当然不是最好的解决办法,正如前面提到的,因为 as_expr 污染了全局宏命名空间。 在这个特定的例子里,as_expr 只是一个简单的宏,它只会被使用一次, 所以,利用内用规则,把它“嵌入”到 foo 这个宏里面吧! 在 foo 仅有的一条规则前面添加一条新匹配模式(新规则), 这个匹配模式由 as_expr 组成(和命名),然后附加上宏的输入参数 $e:expr ; 在展开里填写这个宏被匹配到时具体的内容。从而得到本章开头的代码: #[macro_export]\nmacro_rules! foo { (@as_expr $e:expr) => {$e}; ($($tts:tt)*) => { foo!(@as_expr $($tts)*) };\n}\n# # fn main() {\n# assert_eq!(foo!(42), 42);\n# } 可以看到,没有调用 as_expr 宏,而是递归调用在参数前放置了特殊标记树的 foo!(@as_expr $($tts)*)。 要是你看得仔细些,你甚至会发现这个模式能好地结合 TT 撕咬机 ! 之所以用 @ ,是因为在 Rust 1.2 下,该标记尚无任何在前缀位置的用法; 因此,这个语法定义在当时不会与任何东西撞车。 如果你想用别的符号或特有前缀都可以(比如试试 #、! ), 但 @ 的用例已被传播开来,因此,使用它可能更容易帮助读者理解你的代码。 注意:@ 符号很早之前曾作为前缀被用于表示被垃圾回收了的指针, 那时 Rust 还在采用各种记号代表指针类型。 而现在的 @ 只有一种用法: 将名称绑定至模式中(譬如 match 的模式匹配中)。 在这种用法中它是中缀运算符,与我们的上述用例并不冲突。 还有一点要注意,内用规则通常应排在“真正的”规则之前。 这样做可避免 macro_rules! 错把内用规则调用解析成别的东西,比如表达式。","breadcrumbs":"声明宏 » 模式 » 内用规则 » 内用规则","id":"86","title":"内用规则"},"87":{"body":"内用规则的一个缺点是它们会增加编译时间。 即便最终只有一条规则的宏可以匹配(有效的)宏调用,但编译器必须尝试按顺序匹配所有规则。 如果宏有许多规则,则可能会有许多匹配失败的情况,而使用内部规则会增加此类匹配失败的数量。 此外,@as_expr 方式的标识符使规则变得更长,这略微增加了编译器在匹配时必须做的工作量。 因此,为了获得最佳性能, 最好避免使用内部规则 。 避免使用它们通常也会使复杂的宏更易于阅读。","breadcrumbs":"声明宏 » 模式 » 内用规则 » 性能建议","id":"87","title":"性能建议"},"88":{"body":"macro_rules! init_array { (@accum (0, $_e:expr) -> ($($body:tt)*)) => {init_array!(@as_expr [$($body)*])}; (@accum (1, $e:expr) -> ($($body:tt)*)) => {init_array!(@accum (0, $e) -> ($($body)* $e,))}; (@accum (2, $e:expr) -> ($($body:tt)*)) => {init_array!(@accum (1, $e) -> ($($body)* $e,))}; (@accum (3, $e:expr) -> ($($body:tt)*)) => {init_array!(@accum (2, $e) -> ($($body)* $e,))}; (@as_expr $e:expr) => {$e}; [$e:expr; $n:tt] => { { let e = $e; init_array!(@accum ($n, e.clone()) -> ()) } };\n} let strings: [String; 3] = init_array![String::from(\"hi!\"); 3];\n# assert_eq!(format!(\"{:?}\", strings), \"[\\\"hi!\\\", \\\"hi!\\\", \\\"hi!\\\"]\"); 在 Rust 中,所有宏最终 必须 展开为一个完整、有效的句法元素(比如表达式、条目等等)。 这意味着,不可能定义一个最终展开为残缺构造的宏。 有些人可能希望,上例中的宏能被更加直截了当地表述成: macro_rules! init_array { (@accum 0, $_e:expr) => {/* empty */}; (@accum 1, $e:expr) => {$e}; (@accum 2, $e:expr) => {$e, init_array!(@accum 1, $e)}; (@accum 3, $e:expr) => {$e, init_array!(@accum 2, $e)}; [$e:expr; $n:tt] => { { let e = $e; [init_array!(@accum $n, e)] } };\n} 他们预期的展开过程如下: [init_array!(@accum 3, e)] [e, init_array!(@accum 2, e)] [e, e, init_array!(@accum 1, e)] [e, e, e] 然而,这一思路中,每个中间步骤的展开结果都是一个不完整的表达式。 即便这些中间结果对外部来说绝不可见,Rust 仍然禁止这种用法。 下推累积 (push-down accumulation) 则使我们得以在完全完成之前毋需考虑构造的完整性, 进而累积构建出我们所需的标记序列。 本章开头给出的示例中,宏调用的展开过程如下: init_array! { String:: from ( \"hi!\" ) ; 3 }\ninit_array! { @ accum ( 3 , e . clone ( ) ) -> ( ) }\ninit_array! { @ accum ( 2 , e.clone() ) -> ( e.clone() , ) }\ninit_array! { @ accum ( 1 , e.clone() ) -> ( e.clone() , e.clone() , ) }\ninit_array! { @ accum ( 0 , e.clone() ) -> ( e.clone() , e.clone() , e.clone() , ) }\ninit_array! { @ as_expr [ e.clone() , e.clone() , e.clone() , ] } 可以修改一下代码,看到每次调用时 $($body)* 存储的内容变化: macro_rules! init_array { (@accum (0, $_e:expr) -> ($($body:tt)*)) => {init_array!(@as_expr [$($body)*])}; (@accum (1, $e:expr) -> ($($body:tt)*)) => {init_array!(@accum (0, $e) -> ($($body)* $e+3,))}; (@accum (2, $e:expr) -> ($($body:tt)*)) => {init_array!(@accum (1, $e) -> ($($body)* $e+2,))}; (@accum (3, $e:expr) -> ($($body:tt)*)) => {init_array!(@accum (2, $e) -> ($($body)* $e+1,))}; (@as_expr $e:expr) => {$e}; [$e:expr; $n:tt $(; first $init:expr)?] => { { let e = $e; init_array!(@accum ($n, e.clone()) -> ($($init)?,)) } };\n} fn main() { let array: [usize; 4] = init_array![0; 3; first 0]; println!(\"{:?}\", array);\n} 根据 调试 一章的内容, 在 nightly Rust 中使用编译命令: cargo rustc --bin my-project -- -Z trace-macros ,即得到以下输出: note: trace_macro --> src/main.rs:20:31 |\n20 | let array: [usize; 4] = init_array![0; 3; first 0]; | ^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: expanding `init_array! { 0 ; 3 ; first 0 }` = note: to `{ let e = 0 ; init_array! (@ accum(3, e.clone()) -> (0,)) }` = note: expanding `init_array! { @ accum(3, e.clone()) -> (0,) }` = note: to `init_array! (@ accum(2, e.clone()) -> (0, e.clone() + 1,))` = note: expanding `init_array! { @ accum(2, e.clone()) -> (0, e.clone() + 1,) }` = note: to `init_array! (@ accum(1, e.clone()) -> (0, e.clone() + 1, e.clone() + 2,))` = note: expanding `init_array! { @ accum(1, e.clone()) -> (0, e.clone() + 1, e.clone() + 2,) }` = note: to `init_array! (@ accum(0, e.clone()) -> (0, e.clone() + 1, e.clone() + 2, e.clone() + 3,))` = note: expanding `init_array! { @ accum(0, e.clone()) -> (0, e.clone() + 1, e.clone() + 2, e.clone() + 3,) }` = note: to `init_array! (@ as_expr [0, e.clone() + 1, e.clone() + 2, e.clone() + 3,])` = note: expanding `init_array! { @ as_expr [0, e.clone() + 1, e.clone() + 2, e.clone() + 3,] }` = note: to `[0, e.clone() + 1, e.clone() + 2, e.clone() + 3]` 可以看到,每一步都在累积输出,直到规则完成,给出完整的表达式。 上述过程的关键点在于,使用 $($body:tt)* 来保存输出中间值, 而不触发其它解析机制。采用 ($input) -> ($output) 的形式仅是出于传统,用以明示此类宏的作用。 由于可以存储任意复杂的中间结果, 下推累积在构建 TT 撕咬机 的过程中经常被用到。 当构造类似于这个例子的宏时,也会结合 内用规则 。","breadcrumbs":"声明宏 » 模式 » 下推累积 » 下推累积","id":"88","title":"下推累积"},"89":{"body":"下推累积本质上是二次复杂度的。考虑一个包含 100 个标记树的累加器 [1] ,每次调用一个标记树: 初始调用将匹配空的累加器 调用第一个递归将匹配 1 个标记树累加器 调用下一个递归将匹配 2 个标记树累加器 以此类推,最多 100 个 这是一个典型的二次复杂度模式,长输入会导致宏延长编译时间。 此外,TT 撕咬机对其输入也是天生的二次复杂度,所以同时使用 TT 撕咬机和下推累积的宏将是双倍二次的! 所有关于 TT 撕咬机的 性能建议 都适用于下推积累。 一般来说,避免过多地使用它们,并尽可能地让它们的简单。 最后,确保将累加器放在规则的末尾,而不是开头。 这样,如果匹配规则失败,编译器就不必匹配(可能很长的)累加器,从而避免遇到规则中不匹配的部分。这可能会对编译时间产生很大影响。 译者注:accumulator,即使用下推累积方式编写的声明宏。","breadcrumbs":"声明宏 » 模式 » 下推累积 » 性能建议","id":"89","title":"性能建议"},"9":{"body":"展开相对简单。在生成 AST 之后 ,和编译器对程序进行语义理解之前,编译器将会对所有语法拓展进行展开。 这一过程包括:遍历 AST,确定所有语法拓展调用的位置,并把它们替换成展开的内容。 每当编译器遇见一个语法扩展,都会根据上下文解析成有限语法元素集中的一个。 举例来说,如果在模块作用域内调用语法拓展,那么编译器就将它的展开结果解析为表示某项条目 (item) 的 AST 节点;如果在表达式的位置上调用语法拓展,那么编译器就将它的展开结果解析为表示表达式的 AST 节点。 事实上,一个语义扩展的展开结果会变成以下一种情况: 一个表达式 一个模式 一个类型 零或多个条目(包括的 impl 块) 零或多个语句 换句话讲,语法拓展调用所在的位置,决定了该语法拓展展开结果被解读的方式。 编译器会操作 AST 节点,把语法拓展调用处的节点完全替换成输出的节点。这一替换是结构性 (structural) 的,而非织构性 (textural) 的。 比如思考以下代码: let eight = 2 * four!(); 我们可将这部分 AST 可视化地表示为: ┌─────────────┐\n│ Let │\n│ name: eight │ ┌─────────┐\n│ init: ◌ │╶─╴│ BinOp │\n└─────────────┘ │ op: Mul │ ┌╴│ lhs: ◌ │ ┌────────┐ │ │ rhs: ◌ │╶┐ ┌────────────┐ │ LitInt │╶┘ └─────────┘ └╴│ Macro │ │ val: 2 │ │ name: four │ └────────┘ │ body: () │ └────────────┘ 根据上下文,four!() 必须 展开成一个表达式(initializer 只可能是表达式)。因此,无论实际展开的结果如何,它都将被解读成一个完整的表达式。 此处假设 four! 成其展开结果为表达式 1 + 3。故而,展开后将 AST 变为: ┌─────────────┐\n│ Let │\n│ name: eight │ ┌─────────┐\n│ init: ◌ │╶─╴│ BinOp │\n└─────────────┘ │ op: Mul │ ┌╴│ lhs: ◌ │ ┌────────┐ │ │ rhs: ◌ │╶┐ ┌─────────┐ │ LitInt │╶┘ └─────────┘ └╴│ BinOp │ │ val: 2 │ │ op: Add │ └────────┘ ┌╴│ lhs: ◌ │ ┌────────┐ │ │ rhs: ◌ │╶┐ ┌────────┐ │ LitInt │╶┘ └─────────┘ └╴│ LitInt │ │ val: 1 │ │ val: 3 │ └────────┘ └────────┘ 这又能被重写成: let eight = 2 * (1 + 3); 注意,虽然表达式本身不包含括号,但这里仍然加上了它们。这是因为,编译器总是将语法拓展的展开结果看作完整的 AST 节点,而 不是 仅仅把它视为一列标记。 换句话说,即便不显式地把复杂的表达式用括号包起来,编译器也不可能“错意”语法拓展替换的结果,或者改变求值顺序。 语法拓展被当作 AST 节点展开,这一观点非常重要,它造成两大影响: 语法拓展不仅调用位置有限制,其展开结果也只能跟语法解析器在该位置所预期的 AST 节点种类一致。 因此,语法拓展 必定无法 展开成不完整或不合语法的结构。 有关展开还有一点值得注意:如果某语法扩展的展开结果包含 另一个 语法扩展调用,那会怎么样? 例如,上述 four! 如果被展开成了 1 + three!(),会发生什么? let x = four!(); 展开成: let x = 1 + three!(); 编译器将会检查扩展结果中是否包含更多的语法拓展调用;如果有,它们将被进一步展开。 因此,上述 AST 节点将被再次展开成: let x = 1 + 3; 这里的要点是,语法拓展展开发生在“传递”过程中;要完全展开所有调用,就需要同样多的传递。 嗯,也不全是如此。事实上,编译器为此设置了一个上限。它被称作语法拓展的递归上限,默认值为 128。如果第 128 次展开结果仍然包含语法拓展调用,编译器将会终止并返回一个递归上限溢出的错误信息。 此上限可通过 #![recursion_limit=\"…\"] 来提高,但这种改写必须是 crate 级别的。 一般来讲,可能的话最好还是尽量让语法拓展展开递归次数保持在默认值以下,因为会影响编译时间。","breadcrumbs":"语法拓展 » 宏展开 » 展开","id":"9","title":"展开"},"90":{"body":"macro_rules! replace_expr { ($_t:tt $sub:expr) => {$sub};\n} 在上面代码的模式中,匹配到的重复序列将被直接丢弃, 仅留用它所带来的长度信息(以及元素的类型信息); 且原本标记所在的位置将被替换成某种重复元素。 举个例子,考虑如何为一个元素多于12个 (Rust 1.2 下的元组元素个数的最大值) 的 tuple 提供默认值。 macro_rules! tuple_default { ($($tup_tys:ty),*) => { ( $( replace_expr!( ($tup_tys) Default::default() ), )* ) };\n} macro_rules! replace_expr { ($_t:tt $sub:expr) => { $sub };\n} fn main() { assert_eq!(tuple_default!(i32, bool, String), (i32::default(), bool::default(), String::default()));\n} 仅对此例 : 我们其实可以直接用 $tup_tys::default() 。 上例中,我们 并未真正使用 匹配到的类型。 实际上,我们把它丢弃了,并用一个表达式重复替代 (repetition replacement) 。 换句话说,我们实际关心的不是有哪些类型,而是有多少个类型。","breadcrumbs":"声明宏 » 模式 » 反复替换 » 反复替换","id":"90","title":"反复替换"},"91":{"body":"macro_rules! call_a_or_b_on_tail { ((a: $a:ident, b: $b:ident), call a: $($tail:tt)*) => { $a(stringify!($($tail)*)) }; ((a: $a:ident, b: $b:ident), call b: $($tail:tt)*) => { $b(stringify!($($tail)*)) }; ($ab:tt, $_skip:tt $($tail:tt)*) => { call_a_or_b_on_tail!($ab, $($tail)*) };\n} fn compute_len(s: &str) -> Option { Some(s.len())\n} fn show_tail(s: &str) -> Option { println!(\"tail: {:?}\", s); None\n} fn main() { assert_eq!( call_a_or_b_on_tail!( (a: compute_len, b: show_tail), the recursive part that skips over all these tokens doesn't much care whether we will call a or call b: only the terminal rules care. ), None ); assert_eq!( call_a_or_b_on_tail!( (a: compute_len, b: show_tail), and now, to justify the existence of two paths we will also call a: its input should somehow be self-referential, so let's make it return some eighty-six! ), Some(92) );\n} 在十分复杂的递归宏中,可能需要非常多的参数, 才足以在每层调用之间传递必要的标识符与表达式。 然而,根据实现上的差异,可能存在许多这样的中间层, 它们转发了 (forward) 这些参数,但并没有用到。 因此,将所有这些参数捆绑 (bundle) 在一起,通过分组将其放进单独一棵标记树 tt 里, 可以省事许多。这样一来,那些用不到这些参数的递归层可以直接捕获并替换这棵标记树, 而不需要把整组参数完完全全准准确确地捕获替换掉。 上面的例子把表达式 $a 和 $b 捆绑起来, 然后作为一棵 tt 交由递归规则处理。 随后,终结规则 (terminal rules) 将这组标记解构 (destructure) , 并访问其中的表达式。","breadcrumbs":"声明宏 » 模式 » tt 捆绑 » TT 捆绑","id":"91","title":"TT 捆绑"},"92":{"body":"可重用的宏代码片段 (reusable snippets) 。(也可称作“轮子”)","breadcrumbs":"声明宏 » 构件 » 构件","id":"92","title":"构件"},"93":{"body":"在替换 tt 时,Rust 的解析器并不十分可靠。 当它期望得到某类特定的语法结构时, 如果摆在它面前的是一坨替换后的 tt 标记,就有可能出现问题。 解析器常常直接选择放弃解析,而非尝试去解析它们。 在这类情况中,就要用到 AST 强制转换(简称“强转”)。 #![allow(dead_code)] macro_rules! as_expr { ($e:expr) => {$e} }\nmacro_rules! as_item { ($i:item) => {$i} }\nmacro_rules! as_pat { ($p:pat) => {$p} }\nmacro_rules! as_stmt { ($s:stmt) => {$s} }\nmacro_rules! as_ty { ($t:ty) => {$t} } fn main() { as_item!{struct Dummy;} as_stmt!(let as_pat!(_): as_ty!(_) = as_expr!(42));\n} 这些强制变换经常与 下推累积 宏一同使用, 以使解析器能够将最终输出的 tt 序列当作某类特定的语法结构来对待。 注意:之所以只有这几种强转宏, 是由宏 可以展开成什么 所决定的, 而不是由宏能够捕捉哪些东西所决定的。","breadcrumbs":"声明宏 » 构件 » AST 强制转换 » AST 强制转换","id":"93","title":"AST 强制转换"},"94":{"body":"","breadcrumbs":"声明宏 » 构件 » 计数 » 计数","id":"94","title":"计数"},"95":{"body":"在宏中计数是一项让人吃惊的难搞的活儿。 最简单的方式是采用反复替换 (repetition with replacement) 。 macro_rules! replace_expr { ($_t:tt $sub:expr) => {$sub};\n} macro_rules! count_tts { ($($tts:tt)*) => {0usize $(+ replace_expr!($tts 1usize))*};\n}\n# # fn main() {\n# assert_eq!(count_tts!(0 1 2), 3);\n# } 对于小数目来说,这方法不错,但当输入量到达 500 [1] 左右的标记时, 很可能让编译器崩溃。想想吧,输出的结果将类似: 0usize + 1usize + /* ~500 `+ 1usize`s */ + 1usize 编译器必须把这一大串解析成一棵 AST , 那可会是一棵完美失衡的 500 多级深的二叉树。 译者注:500 这个数据过时了,例子见下面 递归 第三个代码块。","breadcrumbs":"声明宏 » 构件 » 计数 » 反复替换","id":"95","title":"反复替换"},"96":{"body":"递归 (recursion) 是个老套路。 macro_rules! count_tts { () => {0usize}; ($_head:tt $($tail:tt)*) => {1usize + count_tts!($($tail)*)};\n}\n# # fn main() {\n# assert_eq!(count_tts!(0 1 2), 3);\n# } 注意:对于 rustc 1.2 来说,很不幸, 编译器在处理大数量的类型未知的整型字面值时将会出现性能问题。 我们此处显式采用 usize 类型就是为了避免这种不幸。 如果这样做并不合适(比如说,当类型必须可替换时), 可通过 as 来减轻问题。(比如, 0 as $ty、1 as $ty 等)。 这方法管用,但很快就会超出宏递归的次数限制( 目前 是 128 )。 与重复替换不同的是,可通过增加匹配分支来增加可处理的输入面值。 以下为增加匹配分支的改进代码 [2] ,如果把前三个分支注释掉,看看编译器会提示啥 :) macro_rules! count_tts { ($_a:tt $_b:tt $_c:tt $_d:tt $_e:tt $_f:tt $_g:tt $_h:tt $_i:tt $_j:tt $_k:tt $_l:tt $_m:tt $_n:tt $_o:tt $_p:tt $_q:tt $_r:tt $_s:tt $_t:tt $($tail:tt)*) => {20usize + count_tts!($($tail)*)}; ($_a:tt $_b:tt $_c:tt $_d:tt $_e:tt $_f:tt $_g:tt $_h:tt $_i:tt $_j:tt $($tail:tt)*) => {10usize + count_tts!($($tail)*)}; ($_a:tt $_b:tt $_c:tt $_d:tt $_e:tt $($tail:tt)*) => {5usize + count_tts!($($tail)*)}; ($_a:tt $($tail:tt)*) => {1usize + count_tts!($($tail)*)}; () => {0usize};\n} fn main() { assert_eq!(700, count_tts!( ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ));\n} 可以复制下面的例子运行看看,里面包含递归和反复匹配(代码已隐藏)两种方法。 macro_rules! count_tts { ($_a:tt $_b:tt $_c:tt $_d:tt $_e:tt $_f:tt $_g:tt $_h:tt $_i:tt $_j:tt $_k:tt $_l:tt $_m:tt $_n:tt $_o:tt $_p:tt $_q:tt $_r:tt $_s:tt $_t:tt $($tail:tt)*) => {20usize + count_tts!($($tail)*)}; ($_a:tt $_b:tt $_c:tt $_d:tt $_e:tt $_f:tt $_g:tt $_h:tt $_i:tt $_j:tt $($tail:tt)*) => {10usize + count_tts!($($tail)*)}; ($_a:tt $_b:tt $_c:tt $_d:tt $_e:tt $($tail:tt)*) => {5usize + count_tts!($($tail)*)}; ($_a:tt $($tail:tt)*) => {1usize + count_tts!($($tail)*)}; () => {0usize};\n} // 可试试“反复替代”的方式计数\n// --snippet--\n# // macro_rules! replace_expr {\n# // ($_t:tt $sub:expr) => {\n# // $sub\n# // };\n# // }\n# //\n# // macro_rules! count_tts {\n# // ($($tts:tt)*) => {0usize $(+ replace_expr!($tts 1usize))*};\n# // } fn main() { assert_eq!(2500, count_tts!( ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, // --snippet-- # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# # ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,\n# // 默认的递归限制让改进的递归代码也无法继续下去了 // 反复替换的代码还能够运行,但明显效率不会很高 // ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, // ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,, ));\n} 译者注:如果不显式提高 128 的递归限制的话, 这个例子中,增加匹配分支办法可以处理最多 \\(20 \\times 128 = 2560 \\) 个标记。","breadcrumbs":"声明宏 » 构件 » 计数 » 递归","id":"96","title":"递归"},"97":{"body":"第三种方法,是帮助编译器构建一个深度较小的 AST ,以避免栈溢出。 可以通过构造数组,并调用其 len 方法来做到。(slice length) macro_rules! replace_expr { ($_t:tt $sub:expr) => {$sub};\n} macro_rules! count_tts { ($($tts:tt)*) => {<[()]>::len(&[$(replace_expr!($tts ())),*])};\n} fn main() { assert_eq!(count_tts!(0 1 2), 3); const N: usize = count_tts!(0 1 2); let array = [0; N]; println!(\"{:?}\", array);\n} 经过测试,这种方法可处理高达 10000 个标记数,可能还能多上不少。 [3] 而且可以用于常量表达式,比如当作在 const 值或定长数组的长度值。 [4] 所以基本上此方法是 首选 。 译者注:这个具体的数据可能也过时了,但这个方法的确是高效的。 译者注:原作时这个方法无法用于常量,现在无此限制。","breadcrumbs":"声明宏 » 构件 » 计数 » 切片长度","id":"97","title":"切片长度"},"98":{"body":"当你需要统计 互不相同的标识符 的数量时, 可以利用枚举体的 numeric cast 功能来达到统计成员(即标识符)个数。 macro_rules! count_idents { ($($idents:ident),* $(,)*) => { { #[allow(dead_code, non_camel_case_types)] enum Idents { $($idents,)* __CountIdentsLast } const COUNT: u32 = Idents::__CountIdentsLast as u32; COUNT } };\n}\n# # fn main() {\n# const COUNT: u32 = count_idents!(A, B, C);\n# assert_eq!(COUNT, 3);\n# } 此方法有两大缺陷: 它仅能被用于数有效的标识符(同时还不能是关键词),而且不允许那些标识符有重复 不具备卫生性:如果你的末位标识符(在 __CountIdentsLast [5] 位置上的标识符)的字面值也是输入之一, 那么宏调用就会失败,因为 enum 中包含重复变量。 译者注:__CountIdentsLast 只是一个自定义的标识符,重点在于它处于枚举成员的最后一位。","breadcrumbs":"声明宏 » 构件 » 计数 » 枚举计数","id":"98","title":"枚举计数"},"99":{"body":"另一个递归方法,但是使用了 位操作 (bit operations) [6] : macro_rules! count_tts { () => { 0 }; ($odd:tt $($a:tt $b:tt)*) => { (count_tts!($($a)*) << 1) | 1 }; ($($a:tt $even:tt)*) => { count_tts!($($a)*) << 1 };\n}\n# # fn main() {\n# assert_eq!(count_tts!(0 1 2), 3);\n# } 这种方法非常聪明。 只要它是偶数个,就能有效地将其输入减半, 然后将计数器乘以 2(或者在这种情况下,向左移1位)。 因为由于前一次左移位,此时最低位必须为 0 ,重复直到我们达到基本规则 () => 0 。 如果输入是奇数个,则从第二个输入开始减半,最终将结果进行 或运算(这等效于加 1)。 这样做的好处是,生成计数器的 AST 表达式将以 O(log(n)) 而不是 O(n) 复杂度增长。 请注意,这仍然可能达到递归限制。 让我们手动分析中间的过程: count_tts!(0 0 0 0 0 0 0 0 0 0); 由于我们的标记树数量为偶数(10),因此该调用将与第三条规则匹配。 该匹配分支把奇数项的标记树命名给 $a ,偶数项的标记树命名成 $b , 但是只会对奇数项 $a 展开,这意味着有效地抛弃所有偶数项,切断了一半的输入。 因此,调用现在变为: count_tts!(0 0 0 0 0) << 1; 现在,该调用将匹配第二条规则,因为其输入的令牌树数量为奇数。 在这种情况下,第一个标记树将被丢弃以再次让输入变成偶数个, 然后可以在调用中再次进行减半步骤。 此时,我们可以将奇数时丢弃的一项计数为1,然后再乘以2,因为我们也减半了。 ((count_tts!(0 0) << 1) | 1) << 1; ((count_tts!(0) << 1 << 1) | 1) << 1; (((count_tts!() | 1) << 1 << 1) | 1) << 1; ((((0 << 1) | 1) << 1 << 1) | 1) << 1; 现在,要检查是否正确分析了扩展过程, 我们可以使用 debugging 调试工具。 展开宏后,我们应该得到: ((((0 << 1) | 1) << 1 << 1) | 1) << 1; 没有任何差错,太棒了! 译者注:以下内容为译者自行补充这小节提到的调试。 注意:我这里使用的加、乘运算与上面提到的位运算是一样的。 #![allow(unused)]\nmacro_rules! count_tts { () => { 0 }; ($odd:tt $($a:tt $b:tt)*) => { (count_tts!($($a)*) *2) + 1 }; ($($a:tt $even:tt)*) => { count_tts!($($a)*) *2 };\n} fn main() { count_tts!(0 1 2 3 4 5 6 7 8 9 10);\n} 调试方法(必须在 nightly 版本下): 使用编译命令 cargo rustc -- -Z trace-macros 得到: note: trace_macro --> src/main.rs:9:5 |\n9 | count_tts!(0 1 2 3 4 5 6 7 8 9 10); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: expanding `count_tts! { 0 1 2 3 4 5 6 7 8 9 10 }` = note: to `(count_tts! (1 3 5 7 9) * 2) + 1` = note: expanding `count_tts! { 1 3 5 7 9 }` = note: to `(count_tts! (3 7) * 2) + 1` = note: expanding `count_tts! { 3 7 }` = note: to `count_tts! (3) * 2` = note: expanding `count_tts! { 3 }` = note: to `(count_tts! () * 2) + 1` = note: expanding `count_tts! { }` = note: to `0` 上面的形式太不简洁,所以使用封装好的工具: cargo-expand 。 使用编译命令 cargo expand ,得到: #![feature(prelude_import)]\n#![allow(unused)]\n#[prelude_import]\nuse std::prelude::rust_2018::*;\n#[macro_use]\nextern crate std;\nfn main() { (((((0 * 2) + 1) * 2 * 2) + 1) * 2) + 1;\n} 这种方法的归功于 Reddit 用户 YatoRust 。","breadcrumbs":"声明宏 » 构件 » 计数 » bit twiddling","id":"99","title":"bit twiddling"}},"length":127,"save":true},"fields":["title","body","breadcrumbs"],"index":{"body":{"root":{"0":{".":{".":{"2":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":2,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"df":2,"docs":{"35":{"tf":1.0},"36":{"tf":1.0}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":2,"docs":{"23":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"1":{"2":{"3":{"4":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"_":{"_":{"_":{"_":{"_":{"_":{"0":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"0":{"0":{"0":{"1":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"0":{"0":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"0":{"0":{"0":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":22,"docs":{"10":{"tf":2.23606797749979},"101":{"tf":2.23606797749979},"102":{"tf":1.7320508075688772},"115":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"20":{"tf":1.7320508075688772},"21":{"tf":4.47213595499958},"22":{"tf":3.0},"23":{"tf":5.0},"24":{"tf":2.23606797749979},"35":{"tf":1.0},"36":{"tf":1.7320508075688772},"49":{"tf":2.0},"58":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"79":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"88":{"tf":4.69041575982343},"96":{"tf":1.0},"97":{"tf":1.0},"99":{"tf":4.795831523312719}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":2,"docs":{"95":{"tf":1.4142135623730951},"96":{"tf":2.0}}}}}}},"1":{"+":{"2":{"df":1,"docs":{"6":{"tf":1.0}}},"a":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}},".":{"0":{"df":1,"docs":{"24":{"tf":1.0}},"e":{"df":1,"docs":{"5":{"tf":1.0}}}},"1":{"4":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"2":{"df":4,"docs":{"5":{"tf":1.0},"86":{"tf":1.0},"90":{"tf":1.0},"96":{"tf":1.0}}},"3":{"0":{"df":2,"docs":{"76":{"tf":1.0},"86":{"tf":1.0}}},"1":{"df":1,"docs":{"77":{"tf":1.0}}},"df":0,"docs":{}},"5":{"2":{"df":2,"docs":{"44":{"tf":1.0},"5":{"tf":1.0}}},"4":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"6":{"0":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"0":{"0":{"0":{"df":1,"docs":{"97":{"tf":1.0}}},"df":0,"docs":{}},"df":3,"docs":{"22":{"tf":1.0},"85":{"tf":1.4142135623730951},"89":{"tf":1.4142135623730951}}},"df":5,"docs":{"24":{"tf":2.23606797749979},"38":{"tf":1.4142135623730951},"54":{"tf":2.23606797749979},"57":{"tf":1.0},"99":{"tf":1.7320508075688772}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}}}},"1":{"df":2,"docs":{"57":{"tf":1.0},"60":{"tf":1.0}}},"2":{"0":{"df":1,"docs":{"24":{"tf":1.0}}},"8":{"df":3,"docs":{"85":{"tf":1.0},"9":{"tf":1.4142135623730951},"96":{"tf":1.7320508075688772}}},"df":4,"docs":{"38":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0},"90":{"tf":1.0}}},"3":{"df":3,"docs":{"104":{"tf":1.0},"22":{"tf":1.4142135623730951},"54":{"tf":1.0}}},"4":{"df":1,"docs":{"27":{"tf":1.0}}},"df":40,"docs":{"0":{"tf":1.0},"101":{"tf":2.23606797749979},"102":{"tf":4.358898943540674},"110":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"17":{"tf":1.0},"20":{"tf":2.6457513110645907},"21":{"tf":6.324555320336759},"22":{"tf":4.47213595499958},"23":{"tf":7.54983443527075},"24":{"tf":3.605551275463989},"27":{"tf":1.0},"33":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.7320508075688772},"41":{"tf":1.0},"44":{"tf":1.4142135623730951},"47":{"tf":1.0},"49":{"tf":1.4142135623730951},"5":{"tf":1.0},"54":{"tf":1.0},"58":{"tf":1.0},"6":{"tf":1.0},"68":{"tf":1.4142135623730951},"79":{"tf":2.449489742783178},"8":{"tf":2.23606797749979},"80":{"tf":1.0},"83":{"tf":1.4142135623730951},"84":{"tf":1.0},"85":{"tf":1.4142135623730951},"88":{"tf":4.123105625617661},"89":{"tf":1.4142135623730951},"9":{"tf":2.449489742783178},"95":{"tf":1.4142135623730951},"96":{"tf":1.0},"97":{"tf":1.4142135623730951},"99":{"tf":6.48074069840786}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":2,"docs":{"95":{"tf":1.7320508075688772},"96":{"tf":2.0}},"e":{"`":{"df":1,"docs":{"95":{"tf":1.0}}},"df":0,"docs":{}}}}}},"相":{"df":0,"docs":{},"比":{"df":0,"docs":{},"较":{"df":0,"docs":{},":":{"df":0,"docs":{},"匹":{"df":0,"docs":{},"配":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"2":{".":{"0":{"df":3,"docs":{"125":{"tf":1.0},"3":{"tf":1.0},"78":{"tf":1.0}},"、":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"、":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"78":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"3":{"df":1,"docs":{"33":{"tf":1.0}}},"df":0,"docs":{}},"0":{"1":{"5":{"df":4,"docs":{"123":{"tf":1.0},"73":{"tf":1.4142135623730951},"74":{"tf":1.0},"86":{"tf":1.0}}},"6":{"df":2,"docs":{"0":{"tf":1.0},"123":{"tf":1.0}}},"8":{"df":6,"docs":{"123":{"tf":1.0},"25":{"tf":1.0},"73":{"tf":1.4142135623730951},"76":{"tf":1.0},"77":{"tf":1.7320508075688772},"86":{"tf":1.0}}},"df":0,"docs":{}},"2":{"1":{".":{"0":{"6":{"df":1,"docs":{"126":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"35":{"tf":1.0},"36":{"tf":1.0},"44":{"tf":1.0}}},"2":{".":{"0":{"4":{"df":1,"docs":{"125":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"88":{"tf":1.0},"96":{"tf":1.0}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}}}},"1":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}},"4":{"df":2,"docs":{"24":{"tf":1.0},"54":{"tf":1.0}}},"5":{"6":{"0":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":31,"docs":{"0":{"tf":1.0},"101":{"tf":1.4142135623730951},"102":{"tf":2.6457513110645907},"113":{"tf":1.0},"116":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"20":{"tf":1.4142135623730951},"21":{"tf":4.69041575982343},"22":{"tf":3.872983346207417},"23":{"tf":4.47213595499958},"24":{"tf":1.7320508075688772},"27":{"tf":1.0},"28":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.7320508075688772},"44":{"tf":1.0},"48":{"tf":1.0},"5":{"tf":1.0},"57":{"tf":2.6457513110645907},"6":{"tf":1.0},"68":{"tf":1.4142135623730951},"8":{"tf":1.7320508075688772},"84":{"tf":1.0},"88":{"tf":3.872983346207417},"89":{"tf":1.0},"9":{"tf":2.0},"95":{"tf":1.0},"96":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951},"99":{"tf":3.7416573867739413}},"相":{"df":0,"docs":{},"比":{"df":0,"docs":{},"较":{"df":0,"docs":{},":":{"df":0,"docs":{},"匹":{"df":0,"docs":{},"配":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"(":{"df":0,"docs":{},"或":{"df":0,"docs":{},"者":{"df":0,"docs":{},"在":{"df":0,"docs":{},"这":{"df":0,"docs":{},"种":{"df":0,"docs":{},"情":{"df":0,"docs":{},"况":{"df":0,"docs":{},"下":{"df":0,"docs":{},",":{"df":0,"docs":{},"向":{"df":0,"docs":{},"左":{"df":0,"docs":{},"移":{"1":{"df":1,"docs":{"99":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}}}},"3":{".":{"1":{"4":{"1":{"5":{"9":{"df":1,"docs":{"17":{"tf":1.0}},"f":{"3":{"2":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"]":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"22":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"22":{"tf":1.0}}},"6":{"2":{"8":{"8":{"0":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"df":1,"docs":{"104":{"tf":1.4142135623730951}}},"df":24,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"102":{"tf":2.6457513110645907},"117":{"tf":1.0},"122":{"tf":1.0},"15":{"tf":1.4142135623730951},"17":{"tf":1.0},"20":{"tf":1.0},"22":{"tf":1.4142135623730951},"23":{"tf":1.4142135623730951},"35":{"tf":1.0},"36":{"tf":1.7320508075688772},"38":{"tf":3.3166247903554},"46":{"tf":1.0},"5":{"tf":1.0},"68":{"tf":1.4142135623730951},"8":{"tf":2.0},"88":{"tf":4.0},"9":{"tf":2.0},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.4142135623730951},"98":{"tf":1.0},"99":{"tf":3.1622776601683795}}},"4":{".":{"0":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}},"0":{"3":{"2":{"0":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"5":{"tf":1.0}}},"2":{"df":7,"docs":{"10":{"tf":1.7320508075688772},"106":{"tf":1.0},"24":{"tf":2.0},"5":{"tf":1.0},"54":{"tf":2.0},"84":{"tf":1.0},"86":{"tf":1.7320508075688772}},"i":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":10,"docs":{"102":{"tf":4.47213595499958},"15":{"tf":1.4142135623730951},"18":{"tf":1.0},"20":{"tf":1.0},"24":{"tf":1.0},"5":{"tf":1.0},"8":{"tf":1.4142135623730951},"88":{"tf":1.4142135623730951},"97":{"tf":1.0},"99":{"tf":1.7320508075688772}}},"5":{"0":{"0":{"df":1,"docs":{"95":{"tf":2.0}}},"4":{"0":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"16":{"tf":1.0},"22":{"tf":1.4142135623730951},"98":{"tf":1.0},"99":{"tf":2.23606797749979}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}}}},"6":{"8":{"df":1,"docs":{"23":{"tf":2.0}}},"df":4,"docs":{"17":{"tf":1.4142135623730951},"24":{"tf":1.0},"46":{"tf":1.4142135623730951},"99":{"tf":2.0}}},"7":{"2":{"0":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{},"u":{"3":{"2":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"5":{"df":1,"docs":{"22":{"tf":1.0}}},"df":1,"docs":{"99":{"tf":2.6457513110645907}}},"8":{"df":4,"docs":{"22":{"tf":1.4142135623730951},"38":{"tf":1.0},"57":{"tf":1.0},"99":{"tf":1.7320508075688772}}},"9":{"8":{"df":1,"docs":{"85":{"tf":1.0}}},"9":{"df":1,"docs":{"85":{"tf":1.0}}},"df":3,"docs":{"27":{"tf":1.0},"57":{"tf":1.4142135623730951},"99":{"tf":2.449489742783178}}},"_":{"0":{"df":1,"docs":{"23":{"tf":2.449489742783178}}},"1":{"df":1,"docs":{"23":{"tf":2.23606797749979}}},"2":{"df":1,"docs":{"23":{"tf":2.0}}},"3":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}},"_":{"_":{"_":{"_":{"df":1,"docs":{"57":{"tf":1.0}},"o":{"_":{"_":{"_":{"_":{"_":{"df":1,"docs":{"30":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"0":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"98":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"a":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.8284271247461903}}}}},"df":0,"docs":{}},"b":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.449489742783178}}}}},"df":0,"docs":{}},"c":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.449489742783178}}}}},"df":0,"docs":{}},"d":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.449489742783178}}}}},"df":0,"docs":{}},"df":10,"docs":{"106":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"30":{"tf":1.4142135623730951},"32":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"5":{"tf":1.0},"56":{"tf":1.0},"58":{"tf":2.449489742783178},"61":{"tf":1.4142135623730951}},"e":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"88":{"tf":1.7320508075688772}}}}}},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.449489742783178}}}}},"df":0,"docs":{}},"f":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.0}}}}},"df":0,"docs":{}},"g":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.0}}}}},"df":0,"docs":{}},"h":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.0}}}}},"df":0,"docs":{},"e":{"a":{"d":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"i":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.0}}}}},"df":0,"docs":{}},"j":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.0}}}}},"df":0,"docs":{}},"k":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"l":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"m":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"n":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"o":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"p":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"q":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"r":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"s":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"91":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"t":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":5,"docs":{"79":{"tf":1.0},"90":{"tf":1.4142135623730951},"95":{"tf":1.0},"96":{"tf":1.7320508075688772},"97":{"tf":1.0}}}}},"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"60":{"tf":1.0}}}}},"df":0,"docs":{}}}},"a":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"y":{"!":{"(":{"$":{"(":{"$":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"91":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}},":":{":":{"b":{":":{":":{"c":{":":{":":{"d":{"df":1,"docs":{"37":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"i":{"d":{"df":3,"docs":{"24":{"tf":1.0},"54":{"tf":1.0},"91":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"t":{"df":3,"docs":{"46":{"tf":1.0},"79":{"tf":2.0},"99":{"tf":2.0}}}}},"[":{"df":0,"docs":{},"n":{"df":4,"docs":{"21":{"tf":7.280109889280518},"22":{"tf":4.0},"23":{"tf":4.795831523312719},"24":{"tf":1.4142135623730951}}}},"b":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"91":{"tf":1.0}}}}},"a":{"c":{"df":0,"docs":{},"u":{"df":2,"docs":{"101":{"tf":2.0},"102":{"tf":2.8284271247461903}},"s":{"!":{"(":{"$":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"101":{"tf":1.0}}}}}},"(":{"$":{"(":{"$":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"101":{"tf":2.0},"102":{"tf":2.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"57":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"(":{"0":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}},"1":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}},"3":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":1,"docs":{"88":{"tf":4.0}},"u":{"df":0,"docs":{},"l":{"df":3,"docs":{"39":{"tf":1.0},"88":{"tf":1.0},"89":{"tf":1.0}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"115":{"tf":1.0},"117":{"tf":1.0}}}}}},"d":{"d":{"df":3,"docs":{"6":{"tf":1.0},"7":{"tf":2.0},"9":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"46":{"tf":1.4142135623730951}}}}},"df":1,"docs":{"23":{"tf":2.449489742783178}}},"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"(":{"d":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"c":{"df":0,"docs":{},"o":{"d":{"df":4,"docs":{"106":{"tf":1.0},"8":{"tf":1.0},"93":{"tf":1.0},"98":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"99":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":4,"docs":{"22":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"!":{"(":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"45":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"115":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"y":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"48":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"i":{"]":{"[":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"121":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"119":{"tf":1.0}}}},"r":{"df":0,"docs":{},"g":{"0":{"df":2,"docs":{"11":{"tf":1.0},"8":{"tf":1.0}}},"1":{"df":1,"docs":{"8":{"tf":1.0}}},"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"104":{"tf":1.0}},"e":{":":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"104":{"tf":1.0}}},"y":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"104":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":2,"docs":{"8":{"tf":3.0},"83":{"tf":1.0}},"s":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"83":{"tf":1.0}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.0},"41":{"tf":1.0}}}}}}}},"r":{"a":{"df":0,"docs":{},"y":{"df":2,"docs":{"88":{"tf":1.7320508075688772},"97":{"tf":1.4142135623730951}}}},"df":1,"docs":{"7":{"tf":1.0}}}},"s":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"!":{"(":{"$":{"(":{"$":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"86":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"2":{"df":1,"docs":{"93":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"86":{"tf":2.8284271247461903},"87":{"tf":1.0},"88":{"tf":2.23606797749979},"93":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"!":{"df":0,"docs":{},"{":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"93":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":1,"docs":{"93":{"tf":1.0}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"_":{"df":1,"docs":{"93":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"93":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"93":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":1,"docs":{"93":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"93":{"tf":1.0}}},"y":{"!":{"(":{"_":{"df":1,"docs":{"93":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"34":{"tf":1.0},"37":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"!":{"(":{"2":{"5":{"0":{"0":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"0":{"0":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"0":{"df":1,"docs":{"23":{"tf":2.449489742783178}}},"1":{"df":1,"docs":{"23":{"tf":2.23606797749979}}},"2":{"df":1,"docs":{"23":{"tf":2.0}}},"3":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"!":{"(":{"0":{"df":4,"docs":{"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"98":{"tf":1.0}}}}}}},"df":1,"docs":{"17":{"tf":1.0}},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"101":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"!":{"(":{"4":{"2":{"df":1,"docs":{"86":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"(":{"1":{"3":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"88":{"tf":1.0}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"90":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"x":{"df":1,"docs":{"70":{"tf":2.23606797749979}}}},"df":0,"docs":{}},"df":1,"docs":{"91":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"t":{"df":14,"docs":{"14":{"tf":1.0},"16":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"27":{"tf":1.0},"46":{"tf":1.4142135623730951},"6":{"tf":1.7320508075688772},"7":{"tf":2.23606797749979},"8":{"tf":2.0},"9":{"tf":3.1622776601683795},"93":{"tf":1.4142135623730951},"95":{"tf":1.0},"97":{"tf":1.0},"99":{"tf":1.0}}},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"30":{"tf":1.0}}},"df":0,"docs":{}}},"、":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"44":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"50":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"48":{"tf":1.0}}}}}},"r":{"df":1,"docs":{"115":{"tf":1.7320508075688772}},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":7,"docs":{"104":{"tf":1.0},"106":{"tf":2.23606797749979},"107":{"tf":1.4142135623730951},"117":{"tf":1.0},"34":{"tf":1.0},"46":{"tf":2.0},"8":{"tf":2.0}},"e":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"0":{"df":1,"docs":{"117":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"l":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"117":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"57":{"tf":1.0}}}}},"df":0,"docs":{}},"与":{"df":0,"docs":{},"n":{"df":1,"docs":{"24":{"tf":1.0}}}}},"b":{"'":{"b":{"df":1,"docs":{"33":{"tf":1.0}}},"df":0,"docs":{}},"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"y":{"!":{"(":{"$":{"(":{"$":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"91":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}},":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"91":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"t":{"df":3,"docs":{"46":{"tf":1.0},"79":{"tf":1.4142135623730951},"99":{"tf":1.4142135623730951}}}}},"a":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":10,"docs":{"104":{"tf":1.0},"106":{"tf":2.23606797749979},"107":{"tf":1.7320508075688772},"114":{"tf":1.0},"115":{"tf":1.0},"117":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.0},"48":{"tf":2.0},"60":{"tf":1.0}}},"s":{"df":0,"docs":{},"e":{"df":2,"docs":{"107":{"tf":1.0},"63":{"tf":1.0}}}},"z":{"(":{"2":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"104":{"tf":1.4142135623730951},"106":{"tf":2.0},"107":{"tf":1.7320508075688772},"31":{"tf":1.0},"60":{"tf":1.0}}}},"df":17,"docs":{"12":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"22":{"tf":2.6457513110645907},"23":{"tf":2.0},"24":{"tf":1.4142135623730951},"65":{"tf":1.0},"66":{"tf":1.4142135623730951},"67":{"tf":1.0},"69":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"70":{"tf":1.4142135623730951},"8":{"tf":1.0},"84":{"tf":2.0},"91":{"tf":2.6457513110645907},"98":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"22":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"5":{"tf":1.4142135623730951}}}}},"n":{"d":{"df":1,"docs":{"81":{"tf":1.0}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"60":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"d":{"df":1,"docs":{"57":{"tf":1.0}}},"df":3,"docs":{"25":{"tf":1.4142135623730951},"60":{"tf":1.0},"88":{"tf":1.0}},"o":{"df":0,"docs":{},"p":{"df":3,"docs":{"6":{"tf":1.0},"7":{"tf":2.0},"9":{"tf":1.7320508075688772}}}}},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"83":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"t":{"df":2,"docs":{"126":{"tf":1.0},"99":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{":":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":5,"docs":{"16":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":2.449489742783178},"31":{"tf":1.0},"44":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"e":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}}},"o":{"d":{"df":0,"docs":{},"i":{"df":5,"docs":{"104":{"tf":1.0},"57":{"tf":1.4142135623730951},"58":{"tf":1.0},"88":{"tf":3.0},"9":{"tf":1.0}}},"y":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":2,"docs":{"57":{"tf":1.4142135623730951},"58":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"88":{"tf":3.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":3,"docs":{"0":{"tf":1.7320508075688772},"12":{"tf":1.0},"19":{"tf":1.0}}},"l":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"40":{"tf":1.0},"90":{"tf":1.0}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"22":{"tf":1.0}}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"14":{"tf":1.0}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"41":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":2,"docs":{"23":{"tf":1.4142135623730951},"29":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"8":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":4,"docs":{"22":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0},"8":{"tf":1.0}}}}},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"91":{"tf":1.0}}}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"e":{"df":1,"docs":{"70":{"tf":1.4142135623730951}}}}},"c":{"!":{"(":{"$":{"df":0,"docs":{},"i":{"df":1,"docs":{"57":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"/":{"c":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"$":{"df":0,"docs":{},"i":{":":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"a":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"b":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"!":{"(":{"$":{"a":{"b":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"91":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"55":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"57":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"57":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"l":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"!":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"83":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"83":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"!":{"(":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"(":{"\"":{"df":0,"docs":{},"y":{"df":1,"docs":{"83":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"83":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},":":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"83":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":1,"docs":{"83":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"122":{"tf":1.0},"41":{"tf":1.4142135623730951},"58":{"tf":1.4142135623730951},"91":{"tf":2.23606797749979}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}},"s":{"!":{"(":{"(":{"c":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"df":1,"docs":{"46":{"tf":1.0}}},"5":{"df":1,"docs":{"46":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":1,"docs":{"46":{"tf":1.0}},"s":{"!":{"(":{"#":{"[":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"46":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"91":{"tf":1.4142135623730951}}},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"109":{"tf":1.0}}}}}}},"df":6,"docs":{"109":{"tf":1.0},"11":{"tf":1.4142135623730951},"38":{"tf":1.0},"60":{"tf":1.0},"88":{"tf":1.0},"99":{"tf":1.7320508075688772}}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"107":{"tf":1.0}}},"t":{"df":1,"docs":{"98":{"tf":1.0}}}}},"c":{"df":1,"docs":{"2":{"tf":1.0}}},"df":10,"docs":{"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"5":{"tf":1.4142135623730951},"65":{"tf":1.0},"66":{"tf":1.4142135623730951},"67":{"tf":1.0},"69":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"84":{"tf":1.7320508075688772},"98":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":3.872983346207417},"24":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"22":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"101":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"22":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"83":{"tf":1.4142135623730951}}}}}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":3,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.4142135623730951},"88":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"r":{"df":1,"docs":{"1":{"tf":1.0}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":2,"docs":{"123":{"tf":1.4142135623730951},"22":{"tf":1.0}}}},"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"8":{"tf":2.0}}}}},"m":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"(":{"df":1,"docs":{"91":{"tf":1.0}}},"df":1,"docs":{"91":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}},"n":{"c":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"\"":{"$":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}}}}},"a":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"46":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"57":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}}},"df":6,"docs":{"23":{"tf":4.47213595499958},"24":{"tf":1.4142135623730951},"25":{"tf":1.0},"8":{"tf":2.0},"97":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"48":{"tf":1.0}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"y":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"22":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{":":{":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"v":{"1":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"v":{"1":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"0":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":1,"docs":{"11":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"$":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":1,"docs":{"49":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"49":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"18":{"tf":1.4142135623730951},"47":{"tf":1.0},"49":{"tf":2.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},",":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{")":{"*":{")":{"df":0,"docs":{},"并":{"df":0,"docs":{},"替":{"df":0,"docs":{},"换":{"df":0,"docs":{},"为":{"(":{"$":{"(":{"$":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"101":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"x":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"101":{"tf":3.605551275463989},"102":{"tf":2.449489742783178}}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":3,"docs":{"23":{"tf":3.872983346207417},"24":{"tf":1.4142135623730951},"25":{"tf":1.7320508075688772}},"s":{"!":{"(":{"$":{"(":{"$":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"23":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"1":{"df":1,"docs":{"23":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{},"x":{"df":1,"docs":{"23":{"tf":3.3166247903554}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"i":{"d":{"df":1,"docs":{"98":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"!":{"(":{"a":{"df":1,"docs":{"98":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"t":{"df":6,"docs":{"101":{"tf":1.7320508075688772},"79":{"tf":1.4142135623730951},"95":{"tf":1.0},"96":{"tf":2.449489742783178},"97":{"tf":1.0},"99":{"tf":3.4641016151377544}},"s":{"!":{"(":{"$":{"(":{"$":{"a":{"df":2,"docs":{"79":{"tf":2.0},"99":{"tf":2.0}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"96":{"tf":3.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"df":2,"docs":{"97":{"tf":1.0},"99":{"tf":2.449489742783178}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"101":{"tf":1.4142135623730951}}}}},"_":{"df":1,"docs":{"79":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":4,"docs":{"101":{"tf":3.1622776601683795},"102":{"tf":2.449489742783178},"49":{"tf":1.0},"98":{"tf":1.7320508075688772}}}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"55":{"tf":1.0}}}}}},"i":{"df":1,"docs":{"76":{"tf":1.0}},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"55":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"=":{"\"":{"b":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"8":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":21,"docs":{"109":{"tf":2.449489742783178},"11":{"tf":1.0},"113":{"tf":1.0},"118":{"tf":2.6457513110645907},"120":{"tf":1.0},"16":{"tf":1.7320508075688772},"23":{"tf":1.0},"25":{"tf":2.23606797749979},"31":{"tf":1.0},"38":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":3.0},"69":{"tf":3.1622776601683795},"71":{"tf":1.0},"72":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":4.0},"77":{"tf":2.23606797749979},"86":{"tf":1.0},"9":{"tf":1.0},"99":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{}}}},"z":{"df":0,"docs":{},"i":{"df":1,"docs":{"84":{"tf":1.0}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"22":{"tf":1.0}}}}},"d":{"[":{"0":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":3,"docs":{"17":{"tf":1.4142135623730951},"22":{"tf":1.0},"7":{"tf":1.4142135623730951}},"e":{"a":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"43":{"tf":1.0}},"e":{"!":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"43":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"99":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":1,"docs":{"84":{"tf":1.0}}},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"38":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"5":{"tf":1.7320508075688772},"55":{"tf":1.0},"65":{"tf":1.7320508075688772},"66":{"tf":1.7320508075688772},"67":{"tf":1.4142135623730951},"69":{"tf":2.6457513110645907}},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"122":{"tf":1.0},"31":{"tf":2.6457513110645907},"81":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":6,"docs":{"18":{"tf":2.0},"47":{"tf":1.0},"48":{"tf":1.0},"49":{"tf":1.7320508075688772},"50":{"tf":1.0},"51":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":7,"docs":{"104":{"tf":1.4142135623730951},"110":{"tf":1.0},"113":{"tf":1.0},"116":{"tf":3.4641016151377544},"117":{"tf":2.23606797749979},"121":{"tf":1.4142135623730951},"8":{"tf":1.0}},"e":{"(":{"$":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"110":{"tf":1.0}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"106":{"tf":1.0},"107":{"tf":1.0},"8":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"116":{"tf":1.0},"117":{"tf":1.4142135623730951}},"v":{"df":1,"docs":{"116":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"121":{"tf":1.4142135623730951}}}}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"91":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"i":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"62":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":1,"docs":{"84":{"tf":1.4142135623730951}},"s":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"c":{"df":1,"docs":{"34":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"91":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"48":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"83":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"(":{"$":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"_":{"df":1,"docs":{"58":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"57":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"57":{"tf":1.7320508075688772}}}}}}},"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"57":{"tf":2.0},"58":{"tf":2.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"n":{"df":2,"docs":{"39":{"tf":1.0},"88":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":4,"docs":{"57":{"tf":3.0},"58":{"tf":1.4142135623730951},"8":{"tf":1.0},"93":{"tf":1.0}}},"y":{"(":{"4":{")":{".":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"(":{")":{".":{"0":{"df":2,"docs":{"57":{"tf":2.0},"58":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"3":{"2":{"df":2,"docs":{"57":{"tf":2.0},"58":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"+":{"1":{"df":1,"docs":{"88":{"tf":1.0}}},"2":{"df":1,"docs":{"88":{"tf":1.0}}},"3":{"df":1,"docs":{"88":{"tf":1.0}}},"df":0,"docs":{}},".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"88":{"tf":6.557438524302}}}}}},"df":0,"docs":{}},"0":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"23":{"tf":2.0}}}}}}},"df":0,"docs":{}},"1":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"23":{"tf":2.0}}}}}}},"df":0,"docs":{}},"2":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"23":{"tf":1.0}}}}}}},"df":1,"docs":{"23":{"tf":1.0}}},":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":10,"docs":{"11":{"tf":1.0},"16":{"tf":2.23606797749979},"23":{"tf":2.0},"24":{"tf":1.7320508075688772},"43":{"tf":1.0},"46":{"tf":1.0},"54":{"tf":1.4142135623730951},"86":{"tf":2.0},"88":{"tf":3.7416573867739413},"93":{"tf":1.0}}}}}}},"a":{"c":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"!":{"(":{"$":{"(":{"$":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"60":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"60":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"60":{"tf":1.4142135623730951}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"60":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"60":{"tf":3.1622776601683795}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"d":{"d":{"df":0,"docs":{},"y":{"b":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"35":{"tf":1.0},"36":{"tf":1.0},"44":{"tf":1.0}}}}},"df":13,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"16":{"tf":2.449489742783178},"17":{"tf":1.4142135623730951},"21":{"tf":2.8284271247461903},"22":{"tf":2.8284271247461903},"23":{"tf":2.6457513110645907},"24":{"tf":2.6457513110645907},"54":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772},"86":{"tf":1.7320508075688772},"88":{"tf":5.830951894845301},"93":{"tf":1.0}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":2.0}},"i":{"df":1,"docs":{"91":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.0}}}}}}},"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.0},"38":{"tf":1.0}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"41":{"tf":1.0},"88":{"tf":1.0}}}}}},"n":{"d":{"df":1,"docs":{"5":{"tf":1.4142135623730951}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"107":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"107":{"tf":2.0}},"e":{"df":0,"docs":{},"r":{"!":{"(":{"@":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"107":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":4,"docs":{"107":{"tf":2.6457513110645907},"117":{"tf":1.0},"31":{"tf":1.0},"98":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}},"、":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"116":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"101":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"[":{"df":0,"docs":{},"e":{"0":{"4":{"2":{"4":{"df":1,"docs":{"57":{"tf":1.0}}},"5":{"df":2,"docs":{"23":{"tf":2.0},"54":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":8,"docs":{"17":{"tf":1.0},"22":{"tf":1.0},"41":{"tf":1.4142135623730951},"45":{"tf":1.0},"48":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0},"68":{"tf":1.7320508075688772}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":2,"docs":{"79":{"tf":1.4142135623730951},"99":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"x":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"51":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":3,"docs":{"12":{"tf":1.0},"18":{"tf":1.0},"78":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"91":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"83":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":9,"docs":{"11":{"tf":1.0},"120":{"tf":1.0},"23":{"tf":1.4142135623730951},"24":{"tf":1.0},"38":{"tf":1.0},"47":{"tf":1.0},"60":{"tf":2.23606797749979},"88":{"tf":2.449489742783178},"99":{"tf":2.6457513110645907}}},"df":0,"docs":{},"s":{"df":6,"docs":{"14":{"tf":2.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"18":{"tf":1.0},"47":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"57":{"tf":1.0},"58":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"63":{"tf":1.0}}}}},"r":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"29":{"tf":1.0}}}}}}},"df":7,"docs":{"11":{"tf":1.0},"120":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"27":{"tf":1.0},"29":{"tf":1.4142135623730951},"44":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":9,"docs":{"16":{"tf":1.0},"18":{"tf":1.0},"21":{"tf":1.0},"29":{"tf":1.7320508075688772},"33":{"tf":1.0},"40":{"tf":1.0},"48":{"tf":1.0},"52":{"tf":1.0},"8":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"3":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"df":9,"docs":{"11":{"tf":1.0},"23":{"tf":1.0},"31":{"tf":1.4142135623730951},"38":{"tf":1.0},"69":{"tf":1.7320508075688772},"75":{"tf":1.0},"76":{"tf":2.23606797749979},"77":{"tf":1.0},"99":{"tf":1.0}}}}}}}},"f":{"3":{"2":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{")":{".":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"(":{"1":{"0":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"[":{"df":0,"docs":{},"i":{"df":1,"docs":{"24":{"tf":1.0}}}},"_":{"df":0,"docs":{},"u":{"1":{"2":{"8":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"85":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"85":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"85":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"4":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"85":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"85":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"{":{"0":{"df":1,"docs":{"20":{"tf":1.0}}},"1":{"df":1,"docs":{"20":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"20":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":1,"docs":{"20":{"tf":1.7320508075688772}}}}},"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"52":{"tf":1.0},"81":{"tf":1.0}}}},"l":{"df":0,"docs":{},"s":{"df":2,"docs":{"101":{"tf":1.0},"84":{"tf":1.0}}}}},"df":2,"docs":{"17":{"tf":1.4142135623730951},"85":{"tf":2.8284271247461903}},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":5,"docs":{"121":{"tf":2.23606797749979},"18":{"tf":1.0},"23":{"tf":1.0},"47":{"tf":1.0},"78":{"tf":1.0}},"e":{"(":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":3,"docs":{"78":{"tf":1.0},"79":{"tf":1.0},"81":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"61":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":7,"docs":{"18":{"tf":1.0},"47":{"tf":1.0},"48":{"tf":1.0},"49":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"d":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":3,"docs":{"11":{"tf":1.0},"38":{"tf":1.0},"99":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"60":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"5":{"tf":1.0}}}}}},"i":{"b":{"(":{"1":{"0":{"0":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":1,"docs":{"8":{"tf":1.7320508075688772}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"(":{"1":{"0":{"df":4,"docs":{"21":{"tf":2.0},"22":{"tf":2.0},"23":{"tf":1.7320508075688772},"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"_":{"1":{"0":{"0":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"21":{"tf":2.0},"22":{"tf":2.23606797749979},"23":{"tf":2.8284271247461903},"24":{"tf":1.0}},"o":{"df":0,"docs":{},"n":{"a":{"c":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"20":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":1,"docs":{"106":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"106":{"tf":1.0}},"e":{":":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"106":{"tf":1.0},"107":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"106":{"tf":1.4142135623730951}}},"y":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"i":{"df":1,"docs":{"106":{"tf":1.4142135623730951}},"s":{":":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":3,"docs":{"106":{"tf":2.0},"107":{"tf":2.0},"117":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"101":{"tf":1.0}}}},"d":{"df":2,"docs":{"23":{"tf":2.0},"54":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":1,"docs":{"41":{"tf":1.0}}}},"r":{"df":1,"docs":{"83":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"41":{"tf":1.0},"88":{"tf":2.0}}}}}},"n":{"df":73,"docs":{"10":{"tf":1.7320508075688772},"101":{"tf":1.0},"102":{"tf":1.0},"104":{"tf":2.0},"106":{"tf":1.0},"107":{"tf":1.0},"11":{"tf":1.4142135623730951},"111":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.4142135623730951},"115":{"tf":1.7320508075688772},"116":{"tf":1.0},"117":{"tf":1.0},"120":{"tf":1.0},"15":{"tf":2.0},"17":{"tf":1.7320508075688772},"21":{"tf":2.0},"22":{"tf":2.8284271247461903},"23":{"tf":4.47213595499958},"24":{"tf":2.6457513110645907},"28":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"38":{"tf":2.0},"40":{"tf":1.0},"41":{"tf":2.0},"43":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951},"49":{"tf":1.0},"5":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"55":{"tf":1.4142135623730951},"57":{"tf":3.1622776601683795},"58":{"tf":1.4142135623730951},"60":{"tf":1.0},"61":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.4142135623730951},"67":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.7320508075688772},"70":{"tf":1.7320508075688772},"75":{"tf":1.0},"76":{"tf":1.4142135623730951},"77":{"tf":1.0},"79":{"tf":1.0},"8":{"tf":1.7320508075688772},"81":{"tf":1.4142135623730951},"83":{"tf":1.4142135623730951},"84":{"tf":1.0},"85":{"tf":3.1622776601683795},"86":{"tf":1.7320508075688772},"88":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.7320508075688772},"93":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.7320508075688772},"97":{"tf":1.0},"98":{"tf":1.0},"99":{"tf":1.7320508075688772}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"u":{"3":{"2":{"df":1,"docs":{"37":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"22":{"tf":1.0},"44":{"tf":1.0},"57":{"tf":1.4142135623730951}}}}}},"o":{"!":{"(":{"@":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"86":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"114":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"81":{"tf":1.0}}}}}},"df":0,"docs":{}},"(":{"_":{"df":1,"docs":{"10":{"tf":1.0}}},"b":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"104":{"tf":1.0},"34":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},":":{":":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"40":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"81":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":18,"docs":{"10":{"tf":2.8284271247461903},"106":{"tf":1.7320508075688772},"107":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.4142135623730951},"38":{"tf":2.23606797749979},"41":{"tf":1.4142135623730951},"48":{"tf":2.449489742783178},"49":{"tf":1.4142135623730951},"5":{"tf":1.0},"55":{"tf":1.0},"81":{"tf":1.7320508075688772},"86":{"tf":2.449489742783178}},"、":{"'":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":0,"docs":{}}}},":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"d":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"、":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"<":{"_":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"8":{"tf":1.0}}}}},"df":0,"docs":{}},"df":2,"docs":{"104":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"23":{"tf":2.0},"54":{"tf":1.0},"57":{"tf":1.0}}},"df":0,"docs":{}},"r":{"!":{"(":{")":{"df":0,"docs":{},"、":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"15":{"tf":1.7320508075688772},"24":{"tf":2.23606797749979},"54":{"tf":2.23606797749979},"9":{"tf":2.449489742783178}}}}},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"126":{"tf":1.0},"16":{"tf":1.0},"27":{"tf":1.0}}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"$":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"121":{"tf":1.0}},"i":{"df":1,"docs":{"10":{"tf":1.0}}}}},"n":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"29":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"104":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":3,"docs":{"31":{"tf":1.0},"57":{"tf":1.0},"8":{"tf":1.0}}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"29":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"g":{":":{":":{"<":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{">":{":":{":":{"c":{"df":1,"docs":{"37":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"b":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"!":{"(":{"4":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"84":{"tf":1.0}}}}}},"t":{"df":2,"docs":{"24":{"tf":1.4142135623730951},"54":{"tf":1.4142135623730951}}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"115":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"d":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":2,"docs":{"23":{"tf":2.23606797749979},"24":{"tf":2.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":4,"docs":{"11":{"tf":1.0},"16":{"tf":1.0},"33":{"tf":1.0},"50":{"tf":1.0}}}},"p":{"df":3,"docs":{"38":{"tf":1.4142135623730951},"55":{"tf":1.7320508075688772},"57":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"1":{"df":1,"docs":{"117":{"tf":1.0}}},"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"55":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"55":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"117":{"tf":1.0},"55":{"tf":2.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"22":{"tf":1.0},"5":{"tf":1.0}}}}},"i":{"df":2,"docs":{"70":{"tf":2.0},"88":{"tf":2.0}},"t":{"df":1,"docs":{"41":{"tf":1.0}}}},"o":{"df":1,"docs":{"84":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"34":{"tf":1.0}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"!":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"5":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":1,"docs":{"83":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"123":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":4,"docs":{"10":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.7320508075688772},"81":{"tf":1.7320508075688772}}}}}}}},"i":{"2":{":":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"17":{"tf":1.4142135623730951},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"17":{"tf":2.0},"45":{"tf":1.0}}},"3":{"2":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"104":{"tf":1.4142135623730951},"106":{"tf":1.4142135623730951}}},"df":0,"docs":{}},":":{"df":0,"docs":{},"i":{"d":{"df":5,"docs":{"17":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"57":{"tf":2.23606797749979}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"93":{"tf":1.0}}}}}}},"c":{"df":0,"docs":{},"y":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"30":{"tf":1.0},"41":{"tf":2.0}}},"df":0,"docs":{}}},"df":17,"docs":{"104":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":2.0},"27":{"tf":1.0},"30":{"tf":2.0},"32":{"tf":1.0},"41":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"46":{"tf":1.0},"49":{"tf":1.7320508075688772},"52":{"tf":1.0},"56":{"tf":1.7320508075688772},"81":{"tf":1.0},"83":{"tf":1.0},"98":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":8,"docs":{"16":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0},"46":{"tf":1.4142135623730951},"5":{"tf":1.0},"57":{"tf":1.4142135623730951},"63":{"tf":1.0},"8":{"tf":1.0}}}}},"s":{":":{":":{"_":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"98":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"98":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"、":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"27":{"tf":1.0}}}}}}}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"、":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"44":{"tf":1.0}}}}}},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"$":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"18":{"tf":1.0},"47":{"tf":1.0},"52":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"<":{"'":{"a":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"120":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"23":{"tf":2.23606797749979},"24":{"tf":1.4142135623730951},"31":{"tf":1.0},"40":{"tf":1.0},"57":{"tf":2.0},"58":{"tf":1.0},"8":{"tf":1.0},"81":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"63":{"tf":1.0}}}}}}},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"84":{"tf":1.4142135623730951}}}}}}}}},"d":{":":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"24":{"tf":2.0},"7":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"(":{"0":{"df":2,"docs":{"18":{"tf":1.0},"50":{"tf":1.4142135623730951}}},"1":{"df":3,"docs":{"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"18":{"tf":1.0},"47":{"tf":1.0},"50":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"22":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"<":{"'":{"b":{">":{"(":{"&":{"'":{"b":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}},"df":8,"docs":{"18":{"tf":1.0},"22":{"tf":3.0},"23":{"tf":3.4641016151377544},"24":{"tf":2.449489742783178},"50":{"tf":1.4142135623730951},"51":{"tf":1.0},"52":{"tf":1.0},"7":{"tf":1.0}},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"<":{"'":{"a":{"df":3,"docs":{"22":{"tf":2.449489742783178},"23":{"tf":2.8284271247461903},"24":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"22":{"tf":2.0},"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951}},"{":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}},"i":{"c":{"df":1,"docs":{"50":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"117":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":2,"docs":{"84":{"tf":1.0},"88":{"tf":1.0}}}}}}},"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"!":{"(":{"@":{"a":{"c":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"88":{"tf":3.7416573867739413}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"[":{"0":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"88":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"88":{"tf":4.47213595499958}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":7,"docs":{"21":{"tf":2.0},"22":{"tf":1.4142135623730951},"23":{"tf":2.449489742783178},"24":{"tf":1.4142135623730951},"84":{"tf":1.0},"88":{"tf":1.0},"9":{"tf":1.4142135623730951}},"i":{"df":2,"docs":{"11":{"tf":1.4142135623730951},"9":{"tf":1.0}}},"s":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":5,"docs":{"21":{"tf":4.123105625617661},"22":{"tf":2.0},"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"104":{"tf":1.0},"21":{"tf":1.7320508075688772},"22":{"tf":1.4142135623730951},"23":{"tf":2.0},"24":{"tf":1.4142135623730951},"46":{"tf":2.0}},"e":{"(":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"y":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{"df":0,"docs":{},"i":{"d":{"df":4,"docs":{"49":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0}}},"df":0,"docs":{}}},"df":3,"docs":{"49":{"tf":2.449489742783178},"51":{"tf":1.0},"55":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":7,"docs":{"107":{"tf":1.4142135623730951},"110":{"tf":1.0},"112":{"tf":1.0},"114":{"tf":1.4142135623730951},"21":{"tf":1.4142135623730951},"88":{"tf":1.0},"91":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"27":{"tf":1.0},"39":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"df":1,"docs":{"16":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"86":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"40":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"v":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"57":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":4,"docs":{"0":{"tf":1.4142135623730951},"18":{"tf":1.0},"47":{"tf":1.0},"78":{"tf":1.0}}}}},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"41":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"31":{"tf":1.0}}}}}}},"df":14,"docs":{"103":{"tf":1.7320508075688772},"14":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"23":{"tf":2.23606797749979},"24":{"tf":1.4142135623730951},"27":{"tf":1.0},"31":{"tf":3.0},"38":{"tf":1.7320508075688772},"55":{"tf":1.4142135623730951},"77":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.0}},"、":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"21":{"tf":1.0}}}}}}}},"r":{"df":6,"docs":{"20":{"tf":1.4142135623730951},"21":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"23":{"tf":2.8284271247461903},"24":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951}}}}}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"91":{"tf":1.0}}}}}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}},"y":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":4,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"5":{"tf":1.0},"57":{"tf":2.23606797749979}}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"83":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"83":{"tf":1.7320508075688772}}}}}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"32":{"tf":1.0},"54":{"tf":1.0}}}}},"c":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"5":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"83":{"tf":2.449489742783178}}}},"df":0,"docs":{}},"z":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"8":{"tf":1.0}}},"k":{"df":1,"docs":{"66":{"tf":1.0}}}},"df":0,"docs":{},"n":{"(":{"&":{"[":{"$":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"c":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"!":{"(":{"$":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"97":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":1,"docs":{"51":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"51":{"tf":1.0},"97":{"tf":1.0}},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"(":{"0":{"df":2,"docs":{"18":{"tf":1.0},"51":{"tf":1.0}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"18":{"tf":1.0},"47":{"tf":1.0},"51":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"df":3,"docs":{"18":{"tf":1.0},"51":{"tf":1.0},"97":{"tf":1.0}}}}}},"t":{"'":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{},"s":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"51":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":1.0}}}}},"x":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.4142135623730951}}}}}},"h":{"df":3,"docs":{"6":{"tf":1.0},"7":{"tf":2.0},"9":{"tf":1.7320508075688772}}},"i":{"b":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"109":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":4,"docs":{"109":{"tf":1.0},"25":{"tf":1.7320508075688772},"62":{"tf":1.4142135623730951},"76":{"tf":1.4142135623730951}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"2":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":5,"docs":{"16":{"tf":1.0},"27":{"tf":1.0},"32":{"tf":2.449489742783178},"41":{"tf":1.0},"46":{"tf":1.0}},"e":{":":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"32":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"104":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{":":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":9,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"22":{"tf":1.0},"27":{"tf":1.0},"29":{"tf":1.0},"33":{"tf":2.23606797749979},"35":{"tf":1.0},"36":{"tf":1.0},"5":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"9":{"tf":2.0}}}}},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"o":{"c":{"a":{"df":0,"docs":{},"l":{"df":6,"docs":{"10":{"tf":3.605551275463989},"120":{"tf":2.0},"22":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0},"54":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"x":{"!":{"(":{"$":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"61":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"61":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"84":{"tf":1.0}}}}}}}}}}},"u":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"62":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"m":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"46":{"tf":1.0}}},"df":0,"docs":{}}}}},"a":{"c":{"df":3,"docs":{"25":{"tf":1.4142135623730951},"69":{"tf":1.4142135623730951},"76":{"tf":2.6457513110645907}},"r":{"df":0,"docs":{},"o":{"2":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"119":{"tf":2.0},"120":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"119":{"tf":2.449489742783178},"121":{"tf":1.0}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":6,"docs":{"25":{"tf":1.7320508075688772},"55":{"tf":1.7320508075688772},"72":{"tf":1.0},"76":{"tf":2.0},"80":{"tf":1.0},"86":{"tf":2.0}}}}}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"62":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":76,"docs":{"10":{"tf":2.0},"101":{"tf":2.0},"102":{"tf":1.0},"104":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":1.0},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"14":{"tf":2.449489742783178},"15":{"tf":1.7320508075688772},"16":{"tf":2.23606797749979},"17":{"tf":1.7320508075688772},"21":{"tf":1.7320508075688772},"22":{"tf":2.449489742783178},"23":{"tf":3.605551275463989},"24":{"tf":2.6457513110645907},"25":{"tf":1.7320508075688772},"26":{"tf":1.0},"28":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"38":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":2.23606797749979},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":2.0},"48":{"tf":2.0},"49":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"54":{"tf":1.4142135623730951},"55":{"tf":1.7320508075688772},"57":{"tf":2.449489742783178},"58":{"tf":1.4142135623730951},"60":{"tf":1.0},"61":{"tf":1.0},"62":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.4142135623730951},"67":{"tf":1.4142135623730951},"68":{"tf":2.0},"69":{"tf":2.0},"70":{"tf":2.0},"72":{"tf":1.0},"73":{"tf":1.0},"75":{"tf":1.4142135623730951},"76":{"tf":1.7320508075688772},"77":{"tf":1.4142135623730951},"78":{"tf":1.0},"79":{"tf":2.0},"8":{"tf":2.449489742783178},"80":{"tf":1.0},"81":{"tf":2.0},"83":{"tf":2.0},"84":{"tf":1.7320508075688772},"85":{"tf":1.4142135623730951},"86":{"tf":2.23606797749979},"88":{"tf":1.7320508075688772},"90":{"tf":1.7320508075688772},"91":{"tf":1.0},"93":{"tf":2.23606797749979},"95":{"tf":1.4142135623730951},"96":{"tf":2.23606797749979},"97":{"tf":1.4142135623730951},"98":{"tf":1.0},"99":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"s":{"df":10,"docs":{"11":{"tf":1.0},"23":{"tf":1.0},"38":{"tf":1.0},"69":{"tf":2.449489742783178},"70":{"tf":1.0},"71":{"tf":1.0},"75":{"tf":1.7320508075688772},"76":{"tf":2.0},"77":{"tf":1.4142135623730951},"99":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"76":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":29,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"104":{"tf":1.0},"106":{"tf":1.0},"109":{"tf":2.449489742783178},"117":{"tf":1.0},"119":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"121":{"tf":1.0},"125":{"tf":1.0},"18":{"tf":1.0},"22":{"tf":1.0},"3":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"5":{"tf":1.4142135623730951},"57":{"tf":1.7320508075688772},"58":{"tf":1.4142135623730951},"60":{"tf":1.4142135623730951},"75":{"tf":1.0},"76":{"tf":1.4142135623730951},"78":{"tf":1.0},"79":{"tf":2.6457513110645907},"8":{"tf":1.7320508075688772},"80":{"tf":2.0},"81":{"tf":2.23606797749979},"88":{"tf":1.0},"9":{"tf":1.0},"99":{"tf":1.0}}}},"s":{":":{":":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"76":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"22":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":63,"docs":{"10":{"tf":1.4142135623730951},"101":{"tf":1.0},"102":{"tf":1.0},"104":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":1.0},"11":{"tf":1.4142135623730951},"17":{"tf":1.7320508075688772},"21":{"tf":1.4142135623730951},"22":{"tf":1.7320508075688772},"23":{"tf":3.3166247903554},"24":{"tf":1.7320508075688772},"25":{"tf":1.0},"28":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"38":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":2.0},"43":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951},"49":{"tf":1.0},"5":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"57":{"tf":2.23606797749979},"58":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.4142135623730951},"67":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.7320508075688772},"70":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":1.4142135623730951},"77":{"tf":1.0},"79":{"tf":1.0},"8":{"tf":1.4142135623730951},"81":{"tf":1.0},"83":{"tf":1.4142135623730951},"84":{"tf":1.0},"86":{"tf":1.7320508075688772},"88":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"93":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.7320508075688772},"97":{"tf":1.0},"98":{"tf":1.0},"99":{"tf":1.7320508075688772}}}},"k":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"10":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"!":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"57":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"57":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"!":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"57":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"57":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"91":{"tf":1.0}}},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"114":{"tf":1.0}}}}},"n":{"a":{"df":1,"docs":{"114":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":1,"docs":{"51":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}},"s":{"!":{"(":{"$":{"df":1,"docs":{"46":{"tf":1.0}}},"(":{"c":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"df":1,"docs":{"46":{"tf":1.0}}},"5":{"df":1,"docs":{"46":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":8,"docs":{"11":{"tf":1.0},"23":{"tf":2.23606797749979},"41":{"tf":1.0},"48":{"tf":1.0},"5":{"tf":1.0},"68":{"tf":1.7320508075688772},"8":{"tf":1.4142135623730951},"86":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"103":{"tf":1.0},"14":{"tf":2.0},"15":{"tf":2.449489742783178},"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"79":{"tf":1.0}}}}}},"df":0,"docs":{}},"y":{"b":{"df":1,"docs":{"83":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"b":{"df":0,"docs":{},"e":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}},"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":4,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"123":{"tf":1.4142135623730951},"38":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":3,"docs":{"101":{"tf":1.4142135623730951},"12":{"tf":1.0},"14":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":3,"docs":{"23":{"tf":3.4641016151377544},"24":{"tf":2.8284271247461903},"25":{"tf":1.0}}}}}},"df":4,"docs":{"21":{"tf":2.23606797749979},"22":{"tf":2.23606797749979},"23":{"tf":3.0},"24":{"tf":2.0}}},"t":{"a":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"df":4,"docs":{"104":{"tf":1.0},"106":{"tf":1.7320508075688772},"107":{"tf":1.0},"34":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}},"df":6,"docs":{"104":{"tf":1.0},"106":{"tf":1.7320508075688772},"16":{"tf":1.0},"17":{"tf":1.0},"27":{"tf":1.0},"34":{"tf":2.0}},"v":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"126":{"tf":1.0},"16":{"tf":1.4142135623730951},"18":{"tf":1.0},"27":{"tf":1.0},"52":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"105":{"tf":1.0},"57":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"83":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"41":{"tf":1.0}}}},"t":{"df":1,"docs":{"2":{"tf":1.0}}},"x":{"df":3,"docs":{"122":{"tf":1.0},"54":{"tf":1.0},"81":{"tf":1.0}},"e":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"84":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"!":{"(":{"$":{"(":{"$":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"84":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"d":{"df":9,"docs":{"55":{"tf":1.0},"65":{"tf":1.7320508075688772},"66":{"tf":2.449489742783178},"67":{"tf":1.7320508075688772},"68":{"tf":1.0},"69":{"tf":3.0},"71":{"tf":1.7320508075688772},"75":{"tf":1.0},"76":{"tf":1.0}},"u":{"df":0,"docs":{},"l":{"df":2,"docs":{"31":{"tf":1.0},"57":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"70":{"tf":1.4142135623730951}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":2,"docs":{"101":{"tf":2.23606797749979},"102":{"tf":2.0}}}}},"df":0,"docs":{}}}}},"u":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"91":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":1,"docs":{"9":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":3,"docs":{"22":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0}},"y":{"_":{"a":{"d":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"n":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"39":{"tf":1.0},"84":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"0":{"df":1,"docs":{"57":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":1,"docs":{"57":{"tf":1.4142135623730951}}}}}}},"df":8,"docs":{"10":{"tf":1.0},"17":{"tf":1.0},"22":{"tf":2.449489742783178},"23":{"tf":3.1622776601683795},"24":{"tf":2.0},"35":{"tf":1.0},"36":{"tf":1.0},"57":{"tf":2.6457513110645907}}}},"y":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"113":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"88":{"tf":1.7320508075688772}}}}},"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"112":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"111":{"tf":1.0}}}}}}}},":":{"df":0,"docs":{},"i":{"d":{"df":4,"docs":{"104":{"tf":1.0},"106":{"tf":1.7320508075688772},"107":{"tf":1.0},"84":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":12,"docs":{"104":{"tf":1.0},"106":{"tf":2.0},"107":{"tf":1.0},"120":{"tf":1.7320508075688772},"14":{"tf":1.0},"16":{"tf":1.0},"57":{"tf":1.0},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"81":{"tf":2.23606797749979},"84":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}},"!":{"$":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"110":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"df":8,"docs":{"101":{"tf":2.449489742783178},"102":{"tf":1.0},"11":{"tf":1.0},"21":{"tf":2.449489742783178},"22":{"tf":2.6457513110645907},"23":{"tf":3.3166247903554},"88":{"tf":1.7320508075688772},"97":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"w":{"df":2,"docs":{"22":{"tf":1.0},"81":{"tf":1.0}}},"x":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"21":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"21":{"tf":2.23606797749979},"22":{"tf":2.6457513110645907},"23":{"tf":3.4641016151377544},"24":{"tf":2.449489742783178}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"106":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":7,"docs":{"11":{"tf":1.0},"23":{"tf":1.4142135623730951},"38":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"88":{"tf":1.0},"99":{"tf":1.0}}}}}}}},"o":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":2,"docs":{"46":{"tf":2.0},"8":{"tf":1.0}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"d":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"98":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":1,"docs":{"41":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":2,"docs":{"22":{"tf":1.0},"8":{"tf":1.0}},"e":{"df":2,"docs":{"51":{"tf":1.0},"91":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":5,"docs":{"38":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":3.3166247903554},"88":{"tf":3.605551275463989},"99":{"tf":3.3166247903554}}},"h":{"df":1,"docs":{"14":{"tf":1.0}}}},"w":{"df":1,"docs":{"91":{"tf":1.0}}}},"t":{"df":3,"docs":{"22":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"98":{"tf":1.0}}}}}},"{":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"{":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"o":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"n":{"df":1,"docs":{"99":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"df":1,"docs":{"99":{"tf":1.0}}}},"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"df":0,"docs":{},"o":{"df":1,"docs":{"30":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"d":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":2,"docs":{"79":{"tf":1.4142135623730951},"99":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":3,"docs":{"22":{"tf":3.4641016151377544},"23":{"tf":4.0},"24":{"tf":2.8284271247461903}}}}}}},"g":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}},"h":{"df":1,"docs":{"84":{"tf":1.7320508075688772}}},"n":{"df":3,"docs":{"51":{"tf":1.0},"52":{"tf":1.7320508075688772},"70":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"27":{"tf":1.0}}}}},"df":4,"docs":{"18":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":2.0},"9":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"99":{"tf":1.0}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"41":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"<":{"$":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"23":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"21":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"6":{"4":{"df":3,"docs":{"21":{"tf":1.0},"22":{"tf":1.4142135623730951},"23":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":1,"docs":{"91":{"tf":1.4142135623730951}}}}},"df":5,"docs":{"22":{"tf":1.4142135623730951},"23":{"tf":1.4142135623730951},"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":2,"docs":{"46":{"tf":1.0},"83":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"49":{"tf":1.0},"51":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"49":{"tf":2.449489742783178},"51":{"tf":1.0}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951},"88":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"91":{"tf":1.0}}}}}},"p":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"93":{"tf":1.0}}}},"df":0,"docs":{}}},"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"43":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"57":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}},"s":{"df":5,"docs":{"121":{"tf":1.7320508075688772},"22":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0},"6":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"121":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":1,"docs":{"8":{"tf":1.0}}}}},"t":{"df":1,"docs":{"91":{"tf":1.0}},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"54":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"22":{"tf":1.0}}}},"t":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":2,"docs":{"35":{"tf":1.0},"36":{"tf":1.0}}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"]":{"df":0,"docs":{},":":{"=":{">":{"df":0,"docs":{},"、":{",":{"df":0,"docs":{},"、":{"=":{"df":0,"docs":{},"、":{"df":0,"docs":{},"|":{"df":0,"docs":{},"、":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"、":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"44":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"27":{"tf":1.0},"36":{"tf":2.23606797749979}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":7,"docs":{"104":{"tf":1.4142135623730951},"16":{"tf":1.0},"27":{"tf":1.0},"35":{"tf":1.4142135623730951},"36":{"tf":2.0},"44":{"tf":1.0},"56":{"tf":1.0}},"h":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"37":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":8,"docs":{"16":{"tf":1.0},"27":{"tf":1.0},"34":{"tf":1.0},"37":{"tf":2.0},"44":{"tf":1.4142135623730951},"63":{"tf":1.4142135623730951},"80":{"tf":1.0},"91":{"tf":1.0}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":5,"docs":{"16":{"tf":1.0},"35":{"tf":2.0},"36":{"tf":2.6457513110645907},"57":{"tf":1.0},"8":{"tf":1.0}},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"35":{"tf":1.0},"36":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":1,"docs":{"93":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"83":{"tf":1.4142135623730951}}}}},"l":{"a":{"df":0,"docs":{},"y":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"11":{"tf":1.0},"38":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":1,"docs":{"60":{"tf":2.6457513110645907}}}}},"o":{"df":4,"docs":{"21":{"tf":2.23606797749979},"22":{"tf":2.0},"23":{"tf":3.0},"24":{"tf":2.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"107":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"21":{"tf":1.0},"22":{"tf":1.0}}}}}},"r":{"df":1,"docs":{"0":{"tf":1.0}},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"57":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":4,"docs":{"11":{"tf":1.0},"23":{"tf":1.0},"38":{"tf":1.0},"99":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":3,"docs":{"115":{"tf":1.0},"23":{"tf":1.4142135623730951},"24":{"tf":1.0}}},"y":{"=":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}},"f":{"(":{"\"":{"df":0,"docs":{},"o":{"df":0,"docs":{},"h":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"n":{"!":{"(":{"\"":{"#":{"1":{"df":1,"docs":{"83":{"tf":1.0}}},"2":{"df":1,"docs":{"83":{"tf":1.0}}},"3":{"df":1,"docs":{"83":{"tf":1.0}}},"4":{"df":1,"docs":{"83":{"tf":1.0}}},"5":{"df":1,"docs":{"83":{"tf":1.0}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":1,"docs":{"49":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"49":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":2,"docs":{"11":{"tf":1.0},"8":{"tf":1.0}}}}}},"i":{"df":1,"docs":{"8":{"tf":1.0}}}},"i":{"df":1,"docs":{"83":{"tf":1.0}}},"p":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"91":{"tf":1.0}}}}},"df":0,"docs":{}},"{":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"v":{"df":1,"docs":{"50":{"tf":1.0}}},"}":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"{":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}},"{":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"计":{"df":0,"docs":{},"数":{"df":0,"docs":{},"结":{"df":0,"docs":{},"果":{"df":0,"docs":{},":":{"df":0,"docs":{},"{":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"102":{"tf":2.23606797749979}}}},"df":0,"docs":{}}}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"y":{"!":{"(":{"$":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"84":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":14,"docs":{"102":{"tf":2.0},"21":{"tf":2.0},"22":{"tf":2.0},"23":{"tf":2.0},"24":{"tf":1.4142135623730951},"41":{"tf":1.0},"46":{"tf":1.0},"51":{"tf":1.0},"57":{"tf":2.449489742783178},"58":{"tf":1.0},"8":{"tf":1.0},"83":{"tf":1.4142135623730951},"88":{"tf":1.0},"97":{"tf":1.0}}}}}},"v":{"df":1,"docs":{"44":{"tf":1.0}}}},"o":{"c":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"2":{"df":1,"docs":{"120":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":5,"docs":{"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0},"119":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"_":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"112":{"tf":1.0},"115":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"116":{"tf":1.0},"117":{"tf":1.0}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"l":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"116":{"tf":1.0},"117":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":7,"docs":{"109":{"tf":1.4142135623730951},"111":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":2.6457513110645907},"121":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":7,"docs":{"10":{"tf":1.0},"104":{"tf":1.0},"109":{"tf":2.23606797749979},"119":{"tf":3.4641016151377544},"120":{"tf":1.0},"121":{"tf":1.4142135623730951},"8":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"8":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"107":{"tf":1.7320508075688772},"84":{"tf":1.0}}}}}},"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"88":{"tf":1.0}}}},"df":0,"docs":{}}}}},"u":{"b":{"(":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"106":{"tf":1.7320508075688772},"107":{"tf":1.7320508075688772},"41":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"41":{"tf":1.4142135623730951}}}}},"_":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"41":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":12,"docs":{"104":{"tf":1.0},"106":{"tf":1.4142135623730951},"111":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0},"41":{"tf":2.449489742783178},"55":{"tf":1.4142135623730951},"81":{"tf":1.4142135623730951}},"、":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"(":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{")":{"df":0,"docs":{},"、":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"80":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"39":{"tf":1.0},"88":{"tf":1.0}}}},"t":{"df":1,"docs":{"84":{"tf":1.0}}}},"y":{"df":1,"docs":{"123":{"tf":1.0}}}},"q":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"60":{"tf":1.0}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"41":{"tf":1.0},"63":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"114":{"tf":1.0}}}},"df":0,"docs":{},"z":{"df":2,"docs":{"27":{"tf":1.0},"54":{"tf":1.0}}}},"o":{"df":0,"docs":{},"t":{"df":3,"docs":{"113":{"tf":1.0},"120":{"tf":2.449489742783178},"85":{"tf":1.0}}}},"u":{"df":0,"docs":{},"x":{"df":1,"docs":{"60":{"tf":1.0}}}},"x":{"df":1,"docs":{"106":{"tf":1.4142135623730951}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"57":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"83":{"tf":2.0}},"e":{"!":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"83":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"r":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":5,"docs":{"21":{"tf":4.242640687119285},"22":{"tf":2.0},"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}}}}}},"df":3,"docs":{"21":{"tf":1.7320508075688772},"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951}},"r":{"df":6,"docs":{"20":{"tf":1.0},"21":{"tf":3.1622776601683795},"22":{"tf":3.1622776601683795},"23":{"tf":4.0},"24":{"tf":3.0},"25":{"tf":2.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"!":{"(":{"df":0,"docs":{},"f":{"[":{"df":0,"docs":{},"i":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":0,"docs":{}}},"[":{"a":{"[":{"df":0,"docs":{},"n":{"df":4,"docs":{"21":{"tf":1.4142135623730951},"22":{"tf":2.0},"23":{"tf":2.6457513110645907},"24":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"df":0,"docs":{},"r":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"23":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"s":{"df":3,"docs":{"41":{"tf":1.0},"91":{"tf":1.0},"96":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"85":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}}},"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"99":{"tf":1.0}}}}},"df":1,"docs":{"8":{"tf":1.0}},"u":{"df":0,"docs":{},"x":{"df":1,"docs":{"16":{"tf":1.0}}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"83":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":1,"docs":{"104":{"tf":1.0}},"f":{"df":3,"docs":{"35":{"tf":1.0},"36":{"tf":1.0},"8":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":9,"docs":{"103":{"tf":1.0},"108":{"tf":1.0},"117":{"tf":1.0},"12":{"tf":1.0},"18":{"tf":1.0},"27":{"tf":1.0},"38":{"tf":1.0},"44":{"tf":1.0},"63":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"91":{"tf":1.0}}}}}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"38":{"tf":1.4142135623730951},"57":{"tf":1.0}}}}},"p":{"df":1,"docs":{"17":{"tf":1.7320508075688772}},"e":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"17":{"tf":2.0}}}}}},"df":4,"docs":{"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951},"49":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":5,"docs":{"17":{"tf":1.0},"49":{"tf":1.7320508075688772},"50":{"tf":1.0},"90":{"tf":1.0},"95":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}}}},"l":{"a":{"c":{"df":2,"docs":{"90":{"tf":1.0},"95":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"!":{"(":{"$":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":2,"docs":{"95":{"tf":1.0},"96":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"(":{"$":{"_":{"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"79":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":1,"docs":{"79":{"tf":1.0}}},"df":4,"docs":{"90":{"tf":1.7320508075688772},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":1,"docs":{"123":{"tf":2.0}}}},"s":{"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":2,"docs":{"60":{"tf":1.0},"61":{"tf":1.0}}}}},"df":1,"docs":{"107":{"tf":2.23606797749979}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"44":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"101":{"tf":1.0},"23":{"tf":2.0}}}}}},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"104":{"tf":1.0}}},"y":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"104":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"104":{"tf":1.0},"91":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"92":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"f":{"c":{"df":3,"docs":{"18":{"tf":1.0},"47":{"tf":1.0},"78":{"tf":1.0}},"s":{"#":{"1":{"5":{"8":{"4":{"df":3,"docs":{"18":{"tf":1.0},"47":{"tf":1.0},"78":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"h":{"df":3,"docs":{"6":{"tf":1.0},"7":{"tf":2.0},"9":{"tf":1.7320508075688772}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"0":{"df":1,"docs":{"14":{"tf":1.0}}},"1":{"df":1,"docs":{"14":{"tf":1.0}}},"df":4,"docs":{"58":{"tf":1.4142135623730951},"68":{"tf":1.7320508075688772},"86":{"tf":1.0},"91":{"tf":1.4142135623730951}},"n":{"df":1,"docs":{"14":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"#":{"3":{"9":{"4":{"1":{"2":{"df":1,"docs":{"78":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"3":{"5":{"2":{"7":{"df":2,"docs":{"18":{"tf":1.0},"47":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"5":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":9,"docs":{"11":{"tf":2.0},"22":{"tf":1.0},"23":{"tf":2.0},"38":{"tf":1.0},"60":{"tf":1.0},"86":{"tf":1.0},"88":{"tf":1.0},"96":{"tf":1.0},"99":{"tf":1.0}}},"df":46,"docs":{"0":{"tf":3.1622776601683795},"10":{"tf":1.4142135623730951},"101":{"tf":1.0},"103":{"tf":1.7320508075688772},"108":{"tf":1.4142135623730951},"109":{"tf":1.7320508075688772},"114":{"tf":1.0},"12":{"tf":1.4142135623730951},"120":{"tf":1.4142135623730951},"121":{"tf":2.449489742783178},"123":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"20":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"27":{"tf":1.4142135623730951},"29":{"tf":1.0},"3":{"tf":1.7320508075688772},"31":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":1.0},"44":{"tf":1.0},"47":{"tf":1.0},"5":{"tf":2.23606797749979},"54":{"tf":1.7320508075688772},"57":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"62":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"77":{"tf":1.0},"8":{"tf":2.8284271247461903},"83":{"tf":1.0},"86":{"tf":1.4142135623730951},"88":{"tf":1.7320508075688772},"90":{"tf":1.0},"93":{"tf":1.0}},",":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"44":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"y":{"df":0,"docs":{},"m":{"df":1,"docs":{"1":{"tf":1.0}}}}},"s":{"!":{"(":{"\"":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":1,"docs":{"93":{"tf":1.0}}}}}}},"a":{"df":1,"docs":{"2":{"tf":1.0}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":3,"docs":{"23":{"tf":2.8284271247461903},"54":{"tf":1.4142135623730951},"63":{"tf":1.7320508075688772}}}},"t":{"df":1,"docs":{"83":{"tf":1.0}}}}},"df":4,"docs":{"11":{"tf":1.4142135623730951},"17":{"tf":1.0},"91":{"tf":1.0},"93":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"0":{"df":1,"docs":{"57":{"tf":1.7320508075688772}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"21":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"21":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"[":{"df":0,"docs":{},"i":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":4,"docs":{"21":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}},"df":3,"docs":{"22":{"tf":2.23606797749979},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}},"p":{"df":0,"docs":{},"o":{"df":4,"docs":{"21":{"tf":2.8284271247461903},"22":{"tf":2.8284271247461903},"23":{"tf":4.0},"24":{"tf":2.8284271247461903}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"[":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{".":{"0":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"_":{":":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"57":{"tf":1.0},"58":{"tf":1.0}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"58":{"tf":1.0}}}},"df":0,"docs":{}}},"df":1,"docs":{"57":{"tf":1.0}}},"df":10,"docs":{"105":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":2.23606797749979},"23":{"tf":2.8284271247461903},"24":{"tf":2.0},"5":{"tf":1.7320508075688772},"56":{"tf":1.0},"57":{"tf":5.0990195135927845},"58":{"tf":1.4142135623730951},"91":{"tf":1.0}}}},"m":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"38":{"tf":2.0}}}}}}},"df":0,"docs":{}}},"p":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"q":{":":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"24":{"tf":1.4142135623730951}}},"t":{"df":1,"docs":{"44":{"tf":1.0}}}},"h":{"a":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"68":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"32":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"w":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"(":{"df":1,"docs":{"91":{"tf":1.0}}},"df":1,"docs":{"91":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"!":{"(":{"$":{"(":{"$":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"61":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"61":{"tf":1.4142135623730951}},"l":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"e":{"df":2,"docs":{"122":{"tf":1.7320508075688772},"81":{"tf":1.4142135623730951}}}},"x":{"df":1,"docs":{"91":{"tf":1.0}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"91":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":4,"docs":{"22":{"tf":2.449489742783178},"23":{"tf":2.6457513110645907},"24":{"tf":2.0},"97":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"22":{"tf":1.0}}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"51":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":3,"docs":{"25":{"tf":1.4142135623730951},"92":{"tf":1.0},"96":{"tf":1.4142135623730951}}}}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"9":{"2":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"v":{"df":4,"docs":{"21":{"tf":2.0},"22":{"tf":2.0},"23":{"tf":2.8284271247461903},"24":{"tf":2.0}}}},"df":0,"docs":{}}}}},"s":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"91":{"tf":1.0}}}}}},"df":0,"docs":{}}},"_":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"77":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"!":{"(":{"\"":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"77":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"120":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"!":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"77":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"t":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"71":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"71":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"41":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"91":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"21":{"tf":1.4142135623730951},"46":{"tf":2.6457513110645907}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"120":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":3,"docs":{"109":{"tf":1.4142135623730951},"122":{"tf":2.8284271247461903},"53":{"tf":1.0}},"g":{"df":1,"docs":{"15":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":3,"docs":{"126":{"tf":1.0},"16":{"tf":1.0},"27":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"60":{"tf":1.0}}}}},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"0":{":":{"2":{"0":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{":":{"1":{"df":1,"docs":{"60":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{":":{"1":{"0":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}},"2":{"1":{"df":1,"docs":{"58":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{":":{"2":{"1":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"0":{":":{"3":{"1":{"df":1,"docs":{"88":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"2":{"4":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}},"3":{"3":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"8":{":":{"5":{"0":{"df":1,"docs":{"23":{"tf":1.0}}},"2":{"df":1,"docs":{"23":{"tf":1.0}}},"9":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}},"6":{"1":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"1":{"0":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"5":{":":{"4":{"5":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{":":{"5":{"df":1,"docs":{"99":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"84":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"16":{"tf":1.0},"21":{"tf":1.0},"38":{"tf":2.23606797749979},"54":{"tf":1.0},"8":{"tf":1.0}}}}}}},"i":{"c":{"df":5,"docs":{"106":{"tf":1.0},"23":{"tf":1.7320508075688772},"31":{"tf":1.0},"32":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}}}},"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{":":{":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"v":{"1":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"_":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"0":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{":":{":":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{":":{":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"v":{"1":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"11":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"(":{"0":{".":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"(":{"1":{"0":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"22":{"tf":2.0},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":4,"docs":{"22":{"tf":1.4142135623730951},"23":{"tf":2.0},"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"df":1,"docs":{"23":{"tf":1.0}},"i":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"2":{"0":{"1":{"8":{"df":3,"docs":{"11":{"tf":1.0},"38":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"v":{"1":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":4,"docs":{"11":{"tf":1.0},"23":{"tf":1.4142135623730951},"38":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":3,"docs":{"21":{"tf":1.0},"23":{"tf":4.123105625617661},"24":{"tf":3.1622776601683795}}},"m":{"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.0}}}}}}},"df":4,"docs":{"16":{"tf":1.0},"27":{"tf":1.0},"38":{"tf":2.8284271247461903},"44":{"tf":1.0}}}},"r":{"df":3,"docs":{"106":{"tf":1.0},"23":{"tf":1.0},"91":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}}}}}},"$":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"106":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":5,"docs":{"104":{"tf":1.0},"106":{"tf":1.0},"11":{"tf":1.7320508075688772},"88":{"tf":2.0},"90":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"46":{"tf":1.4142135623730951}}},"y":{"!":{"(":{"$":{"(":{"$":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"102":{"tf":2.0}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"102":{"tf":2.0}}}}},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"46":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":1,"docs":{"57":{"tf":1.0}},"n":{"df":0,"docs":{},"n":{"df":2,"docs":{"50":{"tf":1.0},"51":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"51":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"u":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"106":{"tf":2.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":14,"docs":{"10":{"tf":1.0},"106":{"tf":3.4641016151377544},"116":{"tf":1.0},"117":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":2.23606797749979},"23":{"tf":3.0},"24":{"tf":2.0},"31":{"tf":1.4142135623730951},"38":{"tf":2.0},"57":{"tf":2.0},"58":{"tf":1.0},"8":{"tf":1.0},"81":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"9":{"tf":1.0}}}}}},"df":0,"docs":{}}},"y":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":5,"docs":{"21":{"tf":1.0},"22":{"tf":2.0},"23":{"tf":2.0},"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}}}},"df":0,"docs":{}}},"u":{"b":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":5,"docs":{"79":{"tf":1.4142135623730951},"90":{"tf":1.4142135623730951},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0}}}}}}},"df":6,"docs":{"5":{"tf":1.4142135623730951},"79":{"tf":1.4142135623730951},"90":{"tf":1.4142135623730951},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"46":{"tf":1.4142135623730951}}}}}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"81":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"41":{"tf":1.0}}}}}},"w":{"a":{"df":0,"docs":{},"p":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":3,"docs":{"22":{"tf":2.449489742783178},"23":{"tf":2.8284271247461903},"24":{"tf":2.0}}}}}},"df":1,"docs":{"22":{"tf":1.0}}}},"df":0,"docs":{}},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"df":2,"docs":{"121":{"tf":1.7320508075688772},"14":{"tf":1.0}},"t":{"a":{"df":0,"docs":{},"x":{"df":5,"docs":{"3":{"tf":1.0},"48":{"tf":1.0},"54":{"tf":1.0},"6":{"tf":1.0},"62":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"93":{"tf":1.0}}}}},"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":2,"docs":{"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951}}}}}},"t":{"df":0,"docs":{},"t":{"df":3,"docs":{"84":{"tf":1.7320508075688772},"91":{"tf":1.7320508075688772},"96":{"tf":3.0}}}}},"df":1,"docs":{"91":{"tf":1.0}}}}},"df":2,"docs":{"61":{"tf":1.0},"93":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"91":{"tf":1.4142135623730951}}}}}},"x":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"63":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"9":{"tf":1.0}}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"1":{"tf":1.0}}},"i":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"1":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"51":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":2,"docs":{"52":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":4,"docs":{"114":{"tf":1.0},"17":{"tf":1.4142135623730951},"49":{"tf":1.7320508075688772},"96":{"tf":1.0}},"s":{"_":{"df":0,"docs":{},"f":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":0,"docs":{}}}}},"l":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"_":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}},"e":{"!":{"(":{"b":{"df":1,"docs":{"114":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"(":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"116":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"117":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"114":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"117":{"tf":1.7320508075688772}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"_":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"114":{"tf":1.0},"115":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"116":{"tf":1.0},"117":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"c":{"df":1,"docs":{"1":{"tf":1.0}}},"d":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"21":{"tf":1.0},"22":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":12,"docs":{"107":{"tf":1.4142135623730951},"15":{"tf":1.0},"17":{"tf":1.0},"41":{"tf":1.0},"46":{"tf":1.4142135623730951},"5":{"tf":2.0},"58":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772},"8":{"tf":1.0},"83":{"tf":1.0},"91":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"2":{"df":1,"docs":{"119":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":5,"docs":{"111":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":9,"docs":{"109":{"tf":1.0},"111":{"tf":1.4142135623730951},"112":{"tf":1.7320508075688772},"113":{"tf":2.449489742783178},"114":{"tf":2.0},"115":{"tf":1.7320508075688772},"116":{"tf":1.4142135623730951},"117":{"tf":1.4142135623730951},"122":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"39":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"84":{"tf":1.0}}},"l":{"df":2,"docs":{"11":{"tf":1.0},"38":{"tf":1.0}}}},"p":{"df":1,"docs":{"36":{"tf":1.0}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"120":{"tf":1.0}}}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":4,"docs":{"60":{"tf":1.7320508075688772},"61":{"tf":1.0},"88":{"tf":1.0},"99":{"tf":1.0}},"s":{"!":{"(":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"60":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"60":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":4,"docs":{"60":{"tf":1.4142135623730951},"84":{"tf":2.6457513110645907},"88":{"tf":1.0},"99":{"tf":1.0}}},"k":{"df":3,"docs":{"18":{"tf":1.0},"47":{"tf":1.0},"78":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"107":{"tf":1.0},"38":{"tf":1.4142135623730951}}},"t":{"df":5,"docs":{"116":{"tf":1.0},"121":{"tf":1.0},"20":{"tf":1.0},"31":{"tf":1.0},"37":{"tf":1.0}}}},"n":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":6,"docs":{"103":{"tf":1.0},"14":{"tf":1.0},"18":{"tf":1.4142135623730951},"47":{"tf":1.0},"48":{"tf":1.4142135623730951},"79":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"r":{"df":1,"docs":{"47":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":3,"docs":{"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.0}}}},"u":{"df":0,"docs":{},"e":{"df":5,"docs":{"101":{"tf":1.4142135623730951},"109":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"33":{"tf":1.0},"38":{"tf":1.4142135623730951}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"54":{"tf":1.0}}}}}},"t":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":5,"docs":{"104":{"tf":1.0},"107":{"tf":2.0},"41":{"tf":1.0},"61":{"tf":1.0},"85":{"tf":1.4142135623730951}}}}},"df":20,"docs":{"104":{"tf":1.0},"107":{"tf":2.23606797749979},"125":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"27":{"tf":1.4142135623730951},"39":{"tf":2.0},"41":{"tf":2.0},"46":{"tf":1.0},"48":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":2.0},"85":{"tf":2.8284271247461903},"86":{"tf":2.23606797749979},"88":{"tf":1.0},"89":{"tf":1.7320508075688772},"91":{"tf":1.7320508075688772},"93":{"tf":1.7320508075688772}},"s":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":5,"docs":{"46":{"tf":1.0},"86":{"tf":1.7320508075688772},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0}}}}},"df":0,"docs":{}},"、":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"90":{"tf":1.0}}},"y":{"df":0,"docs":{},"s":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"90":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{"df":4,"docs":{"106":{"tf":1.0},"107":{"tf":1.0},"52":{"tf":1.0},"90":{"tf":1.0}},"e":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"w":{"df":0,"docs":{},"i":{"d":{"d":{"df":0,"docs":{},"l":{"df":2,"docs":{"126":{"tf":1.0},"99":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":2,"docs":{"52":{"tf":1.4142135623730951},"91":{"tf":1.0}}}},"y":{"df":6,"docs":{"16":{"tf":1.0},"21":{"tf":1.0},"27":{"tf":1.0},"40":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"96":{"tf":1.0}},"p":{"df":0,"docs":{},"e":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"40":{"tf":1.0}}}}},"df":8,"docs":{"104":{"tf":1.0},"109":{"tf":1.0},"21":{"tf":1.7320508075688772},"22":{"tf":2.23606797749979},"23":{"tf":2.8284271247461903},"24":{"tf":2.0},"31":{"tf":1.0},"40":{"tf":1.7320508075688772}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"37":{"tf":1.0}}}}},"df":0,"docs":{}}}},"、":{"1":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}}}},"u":{"1":{"2":{"8":{"df":1,"docs":{"85":{"tf":2.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"85":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"3":{"2":{"df":5,"docs":{"117":{"tf":1.4142135623730951},"40":{"tf":1.0},"8":{"tf":1.7320508075688772},"85":{"tf":2.8284271247461903},"98":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"6":{"4":{"df":5,"docs":{"21":{"tf":2.6457513110645907},"22":{"tf":4.123105625617661},"23":{"tf":3.605551275463989},"24":{"tf":1.0},"85":{"tf":2.0}}},"df":0,"docs":{}},"8":{"df":3,"docs":{"40":{"tf":1.0},"8":{"tf":1.0},"85":{"tf":1.4142135623730951}}},"df":1,"docs":{"17":{"tf":1.0}},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"101":{"tf":1.0}}}}},"b":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"84":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"66":{"tf":2.0},"67":{"tf":1.4142135623730951},"69":{"tf":2.0}}}}}},"o":{"df":1,"docs":{"123":{"tf":1.0}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"y":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"122":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"116":{"tf":1.0},"31":{"tf":1.0}}}},"t":{"df":4,"docs":{"106":{"tf":1.0},"107":{"tf":1.0},"38":{"tf":1.0},"55":{"tf":1.0}}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"38":{"tf":1.4142135623730951},"83":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"63":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"s":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"、":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"122":{"tf":1.0},"23":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":16,"docs":{"11":{"tf":1.0},"114":{"tf":1.4142135623730951},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"117":{"tf":1.4142135623730951},"119":{"tf":1.0},"22":{"tf":2.8284271247461903},"23":{"tf":3.605551275463989},"24":{"tf":2.449489742783178},"25":{"tf":1.4142135623730951},"31":{"tf":1.0},"38":{"tf":1.0},"55":{"tf":1.0},"77":{"tf":1.0},"8":{"tf":1.0},"99":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"10":{"tf":2.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"a":{"!":{"(":{"a":{"df":2,"docs":{"24":{"tf":1.7320508075688772},"54":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"24":{"tf":1.7320508075688772},"54":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"z":{"df":9,"docs":{"120":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":2.8284271247461903},"23":{"tf":5.656854249492381},"24":{"tf":2.8284271247461903},"25":{"tf":1.0},"88":{"tf":1.4142135623730951},"96":{"tf":1.0},"97":{"tf":1.0}}}}}},"v":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"9":{"tf":2.0}},"i":{"d":{"df":1,"docs":{"58":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":3,"docs":{"23":{"tf":2.0},"54":{"tf":1.0},"57":{"tf":1.4142135623730951}}}},"r":{"df":1,"docs":{"7":{"tf":2.23606797749979}},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":4,"docs":{"17":{"tf":1.0},"48":{"tf":1.0},"54":{"tf":1.0},"57":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"107":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":2,"docs":{"107":{"tf":2.8284271247461903},"117":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":2,"docs":{"17":{"tf":1.7320508075688772},"50":{"tf":1.0}},"e":{"c":{"!":{"[":{"0":{"df":0,"docs":{},"u":{"6":{"4":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.0}},"s":{"!":{"[":{"1":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":2,"docs":{"17":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{},"y":{"df":0,"docs":{},"k":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"123":{"tf":1.0}}}}}}}},"i":{"df":6,"docs":{"104":{"tf":1.0},"106":{"tf":1.7320508075688772},"16":{"tf":1.0},"27":{"tf":1.0},"41":{"tf":2.8284271247461903},"44":{"tf":1.0}},"s":{":":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":4,"docs":{"104":{"tf":1.0},"106":{"tf":1.7320508075688772},"107":{"tf":1.0},"41":{"tf":2.23606797749979}}}}},"_":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"41":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"41":{"tf":2.0}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"60":{"tf":2.23606797749979}}},"r":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"38":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":1,"docs":{"38":{"tf":1.4142135623730951}}}}},"df":1,"docs":{"17":{"tf":1.0}},"e":{"_":{"c":{"a":{"df":0,"docs":{},"n":{"_":{"d":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"77":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":1,"docs":{"15":{"tf":1.7320508075688772}}}}},"t":{"_":{"df":0,"docs":{},"i":{"df":2,"docs":{"46":{"tf":1.0},"57":{"tf":1.0}},"s":{"!":{"(":{"#":{"[":{"$":{"df":0,"docs":{},"m":{"df":1,"docs":{"46":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"46":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"57":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"91":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"60":{"tf":3.0}}}}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"22":{"tf":2.6457513110645907},"23":{"tf":2.8284271247461903},"24":{"tf":2.0}}}}},"df":0,"docs":{},"p":{"df":1,"docs":{"60":{"tf":1.0}}}},"p":{"df":2,"docs":{"105":{"tf":1.0},"108":{"tf":1.0}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"41":{"tf":1.0}}},"l":{"d":{"!":{"\"":{"df":0,"docs":{},"、":{"3":{".":{"1":{"4":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":4,"docs":{"11":{"tf":2.0},"33":{"tf":1.0},"77":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"2":{"df":2,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"s":{"df":2,"docs":{"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"x":{"!":{"(":{"1":{"df":1,"docs":{"68":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"68":{"tf":1.7320508075688772}}},"3":{"df":1,"docs":{"68":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"7":{"df":1,"docs":{"61":{"tf":1.0}}},"8":{"df":1,"docs":{"61":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"7":{"df":0,"docs":{},"f":{"df":1,"docs":{"61":{"tf":1.0}}}},"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"12":{"tf":1.0}}}}}},"df":12,"docs":{"101":{"tf":1.7320508075688772},"17":{"tf":1.4142135623730951},"43":{"tf":1.0},"65":{"tf":2.0},"66":{"tf":3.0},"67":{"tf":2.449489742783178},"68":{"tf":1.7320508075688772},"69":{"tf":3.605551275463989},"70":{"tf":1.0},"75":{"tf":1.4142135623730951},"76":{"tf":3.872983346207417},"9":{"tf":1.7320508075688772}},"o":{"d":{"df":1,"docs":{"60":{"tf":1.0}}},"df":0,"docs":{}}},"y":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"99":{"tf":1.0}}}}}}}}},"df":8,"docs":{"12":{"tf":1.0},"17":{"tf":1.4142135623730951},"23":{"tf":2.449489742783178},"67":{"tf":2.23606797749979},"69":{"tf":3.0},"70":{"tf":2.0},"75":{"tf":1.4142135623730951},"76":{"tf":2.6457513110645907}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"5":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"1":{"tf":1.0}}}}}}},"z":{"df":5,"docs":{"17":{"tf":1.4142135623730951},"23":{"tf":2.0},"60":{"tf":1.4142135623730951},"88":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"101":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"28":{"tf":1.0},"38":{"tf":2.23606797749979}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"=":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"11":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"38":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"breadcrumbs":{"root":{"0":{".":{".":{"2":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":2,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"df":2,"docs":{"35":{"tf":1.0},"36":{"tf":1.0}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":2,"docs":{"23":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"1":{"2":{"3":{"4":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"_":{"_":{"_":{"_":{"_":{"_":{"0":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"0":{"0":{"0":{"1":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"0":{"0":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"0":{"0":{"0":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":22,"docs":{"10":{"tf":2.23606797749979},"101":{"tf":2.23606797749979},"102":{"tf":1.7320508075688772},"115":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"20":{"tf":1.7320508075688772},"21":{"tf":4.47213595499958},"22":{"tf":3.0},"23":{"tf":5.0},"24":{"tf":2.23606797749979},"35":{"tf":1.0},"36":{"tf":1.7320508075688772},"49":{"tf":2.0},"58":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"79":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"88":{"tf":4.69041575982343},"96":{"tf":1.0},"97":{"tf":1.0},"99":{"tf":4.795831523312719}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":2,"docs":{"95":{"tf":1.4142135623730951},"96":{"tf":2.0}}}}}}},"1":{"+":{"2":{"df":1,"docs":{"6":{"tf":1.0}}},"a":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}},".":{"0":{"df":1,"docs":{"24":{"tf":1.0}},"e":{"df":1,"docs":{"5":{"tf":1.0}}}},"1":{"4":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"2":{"df":4,"docs":{"5":{"tf":1.0},"86":{"tf":1.0},"90":{"tf":1.0},"96":{"tf":1.0}}},"3":{"0":{"df":2,"docs":{"76":{"tf":1.0},"86":{"tf":1.0}}},"1":{"df":1,"docs":{"77":{"tf":1.0}}},"df":0,"docs":{}},"5":{"2":{"df":2,"docs":{"44":{"tf":1.0},"5":{"tf":1.0}}},"4":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"6":{"0":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"0":{"0":{"0":{"df":1,"docs":{"97":{"tf":1.0}}},"df":0,"docs":{}},"df":3,"docs":{"22":{"tf":1.0},"85":{"tf":1.4142135623730951},"89":{"tf":1.4142135623730951}}},"df":5,"docs":{"24":{"tf":2.23606797749979},"38":{"tf":1.4142135623730951},"54":{"tf":2.23606797749979},"57":{"tf":1.0},"99":{"tf":1.7320508075688772}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}}}},"1":{"df":2,"docs":{"57":{"tf":1.0},"60":{"tf":1.0}}},"2":{"0":{"df":1,"docs":{"24":{"tf":1.0}}},"8":{"df":3,"docs":{"85":{"tf":1.0},"9":{"tf":1.4142135623730951},"96":{"tf":1.7320508075688772}}},"df":4,"docs":{"38":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0},"90":{"tf":1.0}}},"3":{"df":3,"docs":{"104":{"tf":1.0},"22":{"tf":1.4142135623730951},"54":{"tf":1.0}}},"4":{"df":1,"docs":{"27":{"tf":1.0}}},"df":40,"docs":{"0":{"tf":1.0},"101":{"tf":2.23606797749979},"102":{"tf":4.358898943540674},"110":{"tf":1.0},"116":{"tf":1.0},"120":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"17":{"tf":1.0},"20":{"tf":2.6457513110645907},"21":{"tf":6.324555320336759},"22":{"tf":4.47213595499958},"23":{"tf":7.54983443527075},"24":{"tf":3.605551275463989},"27":{"tf":1.0},"33":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.7320508075688772},"41":{"tf":1.0},"44":{"tf":1.4142135623730951},"47":{"tf":1.0},"49":{"tf":1.4142135623730951},"5":{"tf":1.0},"54":{"tf":1.0},"58":{"tf":1.0},"6":{"tf":1.0},"68":{"tf":1.4142135623730951},"79":{"tf":2.449489742783178},"8":{"tf":2.23606797749979},"80":{"tf":1.0},"83":{"tf":1.4142135623730951},"84":{"tf":1.0},"85":{"tf":1.4142135623730951},"88":{"tf":4.123105625617661},"89":{"tf":1.4142135623730951},"9":{"tf":2.449489742783178},"95":{"tf":1.4142135623730951},"96":{"tf":1.0},"97":{"tf":1.4142135623730951},"99":{"tf":6.48074069840786}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":2,"docs":{"95":{"tf":1.7320508075688772},"96":{"tf":2.0}},"e":{"`":{"df":1,"docs":{"95":{"tf":1.0}}},"df":0,"docs":{}}}}}},"相":{"df":0,"docs":{},"比":{"df":0,"docs":{},"较":{"df":0,"docs":{},":":{"df":0,"docs":{},"匹":{"df":0,"docs":{},"配":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"2":{".":{"0":{"df":6,"docs":{"125":{"tf":1.0},"3":{"tf":1.0},"78":{"tf":1.7320508075688772},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.0}},"、":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"、":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"78":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"3":{"df":1,"docs":{"33":{"tf":1.0}}},"df":0,"docs":{}},"0":{"1":{"5":{"df":4,"docs":{"123":{"tf":1.0},"73":{"tf":1.4142135623730951},"74":{"tf":1.4142135623730951},"86":{"tf":1.0}}},"6":{"df":2,"docs":{"0":{"tf":1.0},"123":{"tf":1.0}}},"8":{"df":6,"docs":{"123":{"tf":1.0},"25":{"tf":1.0},"73":{"tf":1.4142135623730951},"76":{"tf":1.0},"77":{"tf":2.0},"86":{"tf":1.0}}},"df":0,"docs":{}},"2":{"1":{".":{"0":{"6":{"df":1,"docs":{"126":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"35":{"tf":1.0},"36":{"tf":1.0},"44":{"tf":1.0}}},"2":{".":{"0":{"4":{"df":1,"docs":{"125":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"88":{"tf":1.0},"96":{"tf":1.0}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}}}},"1":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}},"4":{"df":2,"docs":{"24":{"tf":1.0},"54":{"tf":1.0}}},"5":{"6":{"0":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":31,"docs":{"0":{"tf":1.0},"101":{"tf":1.4142135623730951},"102":{"tf":2.6457513110645907},"113":{"tf":1.0},"116":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"20":{"tf":1.4142135623730951},"21":{"tf":4.69041575982343},"22":{"tf":3.872983346207417},"23":{"tf":4.47213595499958},"24":{"tf":1.7320508075688772},"27":{"tf":1.0},"28":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.7320508075688772},"44":{"tf":1.0},"48":{"tf":1.0},"5":{"tf":1.0},"57":{"tf":2.6457513110645907},"6":{"tf":1.0},"68":{"tf":1.4142135623730951},"8":{"tf":1.7320508075688772},"84":{"tf":1.0},"88":{"tf":3.872983346207417},"89":{"tf":1.0},"9":{"tf":2.0},"95":{"tf":1.0},"96":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951},"99":{"tf":3.7416573867739413}},"相":{"df":0,"docs":{},"比":{"df":0,"docs":{},"较":{"df":0,"docs":{},":":{"df":0,"docs":{},"匹":{"df":0,"docs":{},"配":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"(":{"df":0,"docs":{},"或":{"df":0,"docs":{},"者":{"df":0,"docs":{},"在":{"df":0,"docs":{},"这":{"df":0,"docs":{},"种":{"df":0,"docs":{},"情":{"df":0,"docs":{},"况":{"df":0,"docs":{},"下":{"df":0,"docs":{},",":{"df":0,"docs":{},"向":{"df":0,"docs":{},"左":{"df":0,"docs":{},"移":{"1":{"df":1,"docs":{"99":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}}}},"3":{".":{"1":{"4":{"1":{"5":{"9":{"df":1,"docs":{"17":{"tf":1.0}},"f":{"3":{"2":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"]":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"22":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"22":{"tf":1.0}}},"6":{"2":{"8":{"8":{"0":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"df":1,"docs":{"104":{"tf":1.4142135623730951}}},"df":24,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"102":{"tf":2.6457513110645907},"117":{"tf":1.0},"122":{"tf":1.0},"15":{"tf":1.4142135623730951},"17":{"tf":1.0},"20":{"tf":1.0},"22":{"tf":1.4142135623730951},"23":{"tf":1.4142135623730951},"35":{"tf":1.0},"36":{"tf":1.7320508075688772},"38":{"tf":3.3166247903554},"46":{"tf":1.0},"5":{"tf":1.0},"68":{"tf":1.4142135623730951},"8":{"tf":2.0},"88":{"tf":4.0},"9":{"tf":2.0},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.4142135623730951},"98":{"tf":1.0},"99":{"tf":3.1622776601683795}}},"4":{".":{"0":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}},"0":{"3":{"2":{"0":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"5":{"tf":1.0}}},"2":{"df":7,"docs":{"10":{"tf":1.7320508075688772},"106":{"tf":1.0},"24":{"tf":2.0},"5":{"tf":1.0},"54":{"tf":2.0},"84":{"tf":1.0},"86":{"tf":1.7320508075688772}},"i":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":10,"docs":{"102":{"tf":4.47213595499958},"15":{"tf":1.4142135623730951},"18":{"tf":1.0},"20":{"tf":1.0},"24":{"tf":1.0},"5":{"tf":1.0},"8":{"tf":1.4142135623730951},"88":{"tf":1.4142135623730951},"97":{"tf":1.0},"99":{"tf":1.7320508075688772}}},"5":{"0":{"0":{"df":1,"docs":{"95":{"tf":2.0}}},"4":{"0":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"16":{"tf":1.0},"22":{"tf":1.4142135623730951},"98":{"tf":1.0},"99":{"tf":2.23606797749979}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}}}},"6":{"8":{"df":1,"docs":{"23":{"tf":2.0}}},"df":4,"docs":{"17":{"tf":1.4142135623730951},"24":{"tf":1.0},"46":{"tf":1.4142135623730951},"99":{"tf":2.0}}},"7":{"2":{"0":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{},"u":{"3":{"2":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"5":{"df":1,"docs":{"22":{"tf":1.0}}},"df":1,"docs":{"99":{"tf":2.6457513110645907}}},"8":{"df":4,"docs":{"22":{"tf":1.4142135623730951},"38":{"tf":1.0},"57":{"tf":1.0},"99":{"tf":1.7320508075688772}}},"9":{"8":{"df":1,"docs":{"85":{"tf":1.0}}},"9":{"df":1,"docs":{"85":{"tf":1.0}}},"df":3,"docs":{"27":{"tf":1.0},"57":{"tf":1.4142135623730951},"99":{"tf":2.449489742783178}}},"_":{"0":{"df":1,"docs":{"23":{"tf":2.449489742783178}}},"1":{"df":1,"docs":{"23":{"tf":2.23606797749979}}},"2":{"df":1,"docs":{"23":{"tf":2.0}}},"3":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}},"_":{"_":{"_":{"_":{"df":1,"docs":{"57":{"tf":1.0}},"o":{"_":{"_":{"_":{"_":{"_":{"df":1,"docs":{"30":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"0":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"98":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"a":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.8284271247461903}}}}},"df":0,"docs":{}},"b":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.449489742783178}}}}},"df":0,"docs":{}},"c":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.449489742783178}}}}},"df":0,"docs":{}},"d":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.449489742783178}}}}},"df":0,"docs":{}},"df":10,"docs":{"106":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772},"30":{"tf":1.4142135623730951},"32":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"5":{"tf":1.0},"56":{"tf":1.0},"58":{"tf":2.6457513110645907},"61":{"tf":1.4142135623730951}},"e":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"88":{"tf":1.7320508075688772}}}}}},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.449489742783178}}}}},"df":0,"docs":{}},"f":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.0}}}}},"df":0,"docs":{}},"g":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.0}}}}},"df":0,"docs":{}},"h":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.0}}}}},"df":0,"docs":{},"e":{"a":{"d":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"i":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.0}}}}},"df":0,"docs":{}},"j":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":2.0}}}}},"df":0,"docs":{}},"k":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"l":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"m":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"n":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"o":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"p":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"q":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"r":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"s":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"91":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"t":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":5,"docs":{"79":{"tf":1.0},"90":{"tf":1.4142135623730951},"95":{"tf":1.0},"96":{"tf":1.7320508075688772},"97":{"tf":1.0}}}}},"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"60":{"tf":1.0}}}}},"df":0,"docs":{}}}},"a":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"y":{"!":{"(":{"$":{"(":{"$":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"91":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}},":":{":":{"b":{":":{":":{"c":{":":{":":{"d":{"df":1,"docs":{"37":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"i":{"d":{"df":3,"docs":{"24":{"tf":1.0},"54":{"tf":1.0},"91":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"t":{"df":3,"docs":{"46":{"tf":1.0},"79":{"tf":2.0},"99":{"tf":2.0}}}}},"[":{"df":0,"docs":{},"n":{"df":4,"docs":{"21":{"tf":7.280109889280518},"22":{"tf":4.0},"23":{"tf":4.795831523312719},"24":{"tf":1.4142135623730951}}}},"b":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"91":{"tf":1.0}}}}},"a":{"c":{"df":0,"docs":{},"u":{"df":2,"docs":{"101":{"tf":2.0},"102":{"tf":2.8284271247461903}},"s":{"!":{"(":{"$":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"101":{"tf":1.0}}}}}},"(":{"$":{"(":{"$":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"101":{"tf":2.0},"102":{"tf":2.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"57":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"(":{"0":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}},"1":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}},"3":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":1,"docs":{"88":{"tf":4.0}},"u":{"df":0,"docs":{},"l":{"df":3,"docs":{"39":{"tf":1.0},"88":{"tf":1.0},"89":{"tf":1.0}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"12":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"115":{"tf":1.0},"117":{"tf":1.0}}}}}},"d":{"d":{"df":3,"docs":{"6":{"tf":1.0},"7":{"tf":2.0},"9":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"46":{"tf":1.4142135623730951}}}}},"df":1,"docs":{"23":{"tf":2.449489742783178}}},"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"(":{"d":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"c":{"df":0,"docs":{},"o":{"d":{"df":4,"docs":{"106":{"tf":1.0},"8":{"tf":1.0},"93":{"tf":1.0},"98":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"99":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":4,"docs":{"22":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"!":{"(":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"45":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"115":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"y":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"48":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"i":{"]":{"[":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"121":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"119":{"tf":1.0}}}},"r":{"df":0,"docs":{},"g":{"0":{"df":2,"docs":{"11":{"tf":1.0},"8":{"tf":1.0}}},"1":{"df":1,"docs":{"8":{"tf":1.0}}},"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"104":{"tf":1.0}},"e":{":":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"104":{"tf":1.0}}},"y":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"104":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":2,"docs":{"8":{"tf":3.0},"83":{"tf":1.0}},"s":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"83":{"tf":1.0}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.0},"41":{"tf":1.0}}}}}}}},"r":{"a":{"df":0,"docs":{},"y":{"df":2,"docs":{"88":{"tf":1.7320508075688772},"97":{"tf":1.4142135623730951}}}},"df":1,"docs":{"7":{"tf":1.0}}}},"s":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"!":{"(":{"$":{"(":{"$":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"86":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"2":{"df":1,"docs":{"93":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"86":{"tf":2.8284271247461903},"87":{"tf":1.0},"88":{"tf":2.23606797749979},"93":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"!":{"df":0,"docs":{},"{":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"93":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":1,"docs":{"93":{"tf":1.0}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"_":{"df":1,"docs":{"93":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"93":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"93":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":1,"docs":{"93":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"93":{"tf":1.0}}},"y":{"!":{"(":{"_":{"df":1,"docs":{"93":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"34":{"tf":1.0},"37":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"!":{"(":{"2":{"5":{"0":{"0":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"0":{"0":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"0":{"df":1,"docs":{"23":{"tf":2.449489742783178}}},"1":{"df":1,"docs":{"23":{"tf":2.23606797749979}}},"2":{"df":1,"docs":{"23":{"tf":2.0}}},"3":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"!":{"(":{"0":{"df":4,"docs":{"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"98":{"tf":1.0}}}}}}},"df":1,"docs":{"17":{"tf":1.0}},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"101":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"!":{"(":{"4":{"2":{"df":1,"docs":{"86":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"(":{"1":{"3":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"88":{"tf":1.0}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"90":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"x":{"df":1,"docs":{"70":{"tf":2.23606797749979}}}},"df":0,"docs":{}},"df":1,"docs":{"91":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"t":{"df":14,"docs":{"14":{"tf":1.0},"16":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"27":{"tf":1.0},"46":{"tf":1.4142135623730951},"6":{"tf":1.7320508075688772},"7":{"tf":2.23606797749979},"8":{"tf":2.449489742783178},"9":{"tf":3.1622776601683795},"93":{"tf":2.0},"95":{"tf":1.0},"97":{"tf":1.0},"99":{"tf":1.0}}},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"30":{"tf":1.0}}},"df":0,"docs":{}}},"、":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"44":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"50":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"48":{"tf":1.0}}}}}},"r":{"df":1,"docs":{"115":{"tf":1.7320508075688772}},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":7,"docs":{"104":{"tf":1.0},"106":{"tf":2.23606797749979},"107":{"tf":1.4142135623730951},"117":{"tf":1.0},"34":{"tf":1.0},"46":{"tf":2.0},"8":{"tf":2.0}},"e":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"0":{"df":1,"docs":{"117":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"l":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"117":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"57":{"tf":1.0}}}}},"df":0,"docs":{}},"与":{"df":0,"docs":{},"n":{"df":1,"docs":{"24":{"tf":1.0}}}}},"b":{"'":{"b":{"df":1,"docs":{"33":{"tf":1.0}}},"df":0,"docs":{}},"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"y":{"!":{"(":{"$":{"(":{"$":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"91":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}},":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"91":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"t":{"df":3,"docs":{"46":{"tf":1.0},"79":{"tf":1.4142135623730951},"99":{"tf":1.4142135623730951}}}}},"a":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":10,"docs":{"104":{"tf":1.0},"106":{"tf":2.23606797749979},"107":{"tf":1.7320508075688772},"114":{"tf":1.0},"115":{"tf":1.0},"117":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.0},"48":{"tf":2.0},"60":{"tf":1.0}}},"s":{"df":0,"docs":{},"e":{"df":2,"docs":{"107":{"tf":1.0},"63":{"tf":1.0}}}},"z":{"(":{"2":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"104":{"tf":1.4142135623730951},"106":{"tf":2.0},"107":{"tf":1.7320508075688772},"31":{"tf":1.0},"60":{"tf":1.0}}}},"df":17,"docs":{"12":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"22":{"tf":2.6457513110645907},"23":{"tf":2.0},"24":{"tf":1.4142135623730951},"65":{"tf":1.0},"66":{"tf":1.4142135623730951},"67":{"tf":1.0},"69":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"70":{"tf":1.4142135623730951},"8":{"tf":1.0},"84":{"tf":2.0},"91":{"tf":2.6457513110645907},"98":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"22":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"5":{"tf":1.4142135623730951}}}}},"n":{"d":{"df":1,"docs":{"81":{"tf":1.0}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"60":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"d":{"df":1,"docs":{"57":{"tf":1.0}}},"df":3,"docs":{"25":{"tf":1.4142135623730951},"60":{"tf":1.0},"88":{"tf":1.0}},"o":{"df":0,"docs":{},"p":{"df":3,"docs":{"6":{"tf":1.0},"7":{"tf":2.0},"9":{"tf":1.7320508075688772}}}}},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"83":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"t":{"df":2,"docs":{"126":{"tf":1.0},"99":{"tf":1.7320508075688772}},"f":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{":":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":5,"docs":{"16":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":2.6457513110645907},"31":{"tf":1.0},"44":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"e":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}}},"o":{"d":{"df":0,"docs":{},"i":{"df":5,"docs":{"104":{"tf":1.0},"57":{"tf":1.4142135623730951},"58":{"tf":1.0},"88":{"tf":3.0},"9":{"tf":1.0}}},"y":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":2,"docs":{"57":{"tf":1.4142135623730951},"58":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"88":{"tf":3.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":3,"docs":{"0":{"tf":1.7320508075688772},"12":{"tf":1.0},"19":{"tf":1.0}}},"l":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"40":{"tf":1.0},"90":{"tf":1.0}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"22":{"tf":1.0}}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"14":{"tf":1.0}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"41":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":2,"docs":{"23":{"tf":1.4142135623730951},"29":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"8":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":4,"docs":{"22":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0},"8":{"tf":1.0}}}}},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"91":{"tf":1.0}}}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"e":{"df":1,"docs":{"70":{"tf":1.4142135623730951}}}}},"c":{"!":{"(":{"$":{"df":0,"docs":{},"i":{"df":1,"docs":{"57":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"/":{"c":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"$":{"df":0,"docs":{},"i":{":":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"a":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"b":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"!":{"(":{"$":{"a":{"b":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"91":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"55":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"57":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"57":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"l":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"!":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"83":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"83":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"!":{"(":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"(":{"\"":{"df":0,"docs":{},"y":{"df":1,"docs":{"83":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"83":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},":":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"83":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":1,"docs":{"83":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"122":{"tf":1.0},"41":{"tf":1.4142135623730951},"58":{"tf":1.4142135623730951},"91":{"tf":2.23606797749979}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}},"s":{"!":{"(":{"(":{"c":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"df":1,"docs":{"46":{"tf":1.0}}},"5":{"df":1,"docs":{"46":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":1,"docs":{"46":{"tf":1.0}},"s":{"!":{"(":{"#":{"[":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"46":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"91":{"tf":1.4142135623730951}}},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"109":{"tf":1.0}}}}}}},"df":6,"docs":{"109":{"tf":1.0},"11":{"tf":1.4142135623730951},"38":{"tf":1.0},"60":{"tf":1.0},"88":{"tf":1.0},"99":{"tf":1.7320508075688772}}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"107":{"tf":1.0}}},"t":{"df":1,"docs":{"98":{"tf":1.0}}}}},"c":{"df":1,"docs":{"2":{"tf":1.0}}},"df":10,"docs":{"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"5":{"tf":1.4142135623730951},"65":{"tf":1.0},"66":{"tf":1.4142135623730951},"67":{"tf":1.0},"69":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772},"84":{"tf":1.7320508075688772},"98":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":3.872983346207417},"24":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"22":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"101":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"22":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"83":{"tf":1.4142135623730951}}}}}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":3,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.4142135623730951},"88":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"r":{"df":1,"docs":{"1":{"tf":1.0}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":2,"docs":{"123":{"tf":1.4142135623730951},"22":{"tf":1.0}}}},"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"8":{"tf":2.0}}}}},"m":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"(":{"df":1,"docs":{"91":{"tf":1.0}}},"df":1,"docs":{"91":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}},"n":{"c":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"\"":{"$":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}}}}},"a":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"46":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"57":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}}},"df":6,"docs":{"23":{"tf":4.47213595499958},"24":{"tf":1.4142135623730951},"25":{"tf":1.0},"8":{"tf":2.0},"97":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"48":{"tf":1.0}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"y":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"22":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{":":{":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"v":{"1":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"v":{"1":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"0":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":1,"docs":{"11":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"$":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":1,"docs":{"49":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"49":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"18":{"tf":1.4142135623730951},"47":{"tf":1.0},"49":{"tf":2.23606797749979}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},",":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{")":{"*":{")":{"df":0,"docs":{},"并":{"df":0,"docs":{},"替":{"df":0,"docs":{},"换":{"df":0,"docs":{},"为":{"(":{"$":{"(":{"$":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"101":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"x":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"101":{"tf":3.605551275463989},"102":{"tf":2.449489742783178}}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":3,"docs":{"23":{"tf":3.872983346207417},"24":{"tf":1.4142135623730951},"25":{"tf":1.7320508075688772}},"s":{"!":{"(":{"$":{"(":{"$":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"23":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"1":{"df":1,"docs":{"23":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{},"x":{"df":1,"docs":{"23":{"tf":3.3166247903554}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"i":{"d":{"df":1,"docs":{"98":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"!":{"(":{"a":{"df":1,"docs":{"98":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"t":{"df":6,"docs":{"101":{"tf":1.7320508075688772},"79":{"tf":1.4142135623730951},"95":{"tf":1.0},"96":{"tf":2.449489742783178},"97":{"tf":1.0},"99":{"tf":3.4641016151377544}},"s":{"!":{"(":{"$":{"(":{"$":{"a":{"df":2,"docs":{"79":{"tf":2.0},"99":{"tf":2.0}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"96":{"tf":3.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"df":2,"docs":{"97":{"tf":1.0},"99":{"tf":2.449489742783178}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"101":{"tf":1.4142135623730951}}}}},"_":{"df":1,"docs":{"79":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":4,"docs":{"101":{"tf":3.1622776601683795},"102":{"tf":2.449489742783178},"49":{"tf":1.0},"98":{"tf":1.7320508075688772}}}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"55":{"tf":1.0}}}}}},"i":{"df":1,"docs":{"76":{"tf":1.0}},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"55":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"=":{"\"":{"b":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"8":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":23,"docs":{"109":{"tf":2.449489742783178},"11":{"tf":1.0},"113":{"tf":1.0},"118":{"tf":3.0},"119":{"tf":1.0},"120":{"tf":1.4142135623730951},"121":{"tf":1.0},"16":{"tf":1.7320508075688772},"23":{"tf":1.0},"25":{"tf":2.23606797749979},"31":{"tf":1.0},"38":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":3.1622776601683795},"69":{"tf":3.1622776601683795},"71":{"tf":1.0},"72":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":4.0},"77":{"tf":2.23606797749979},"86":{"tf":1.0},"9":{"tf":1.0},"99":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{}}}},"z":{"df":0,"docs":{},"i":{"df":1,"docs":{"84":{"tf":1.0}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"22":{"tf":1.0}}}}},"d":{"[":{"0":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":3,"docs":{"17":{"tf":1.4142135623730951},"22":{"tf":1.0},"7":{"tf":1.4142135623730951}},"e":{"a":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"43":{"tf":1.0}},"e":{"!":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"43":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"99":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":1,"docs":{"84":{"tf":1.0}}},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"38":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"5":{"tf":1.7320508075688772},"55":{"tf":1.0},"65":{"tf":1.7320508075688772},"66":{"tf":1.7320508075688772},"67":{"tf":1.4142135623730951},"69":{"tf":2.6457513110645907}},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"122":{"tf":1.0},"31":{"tf":2.6457513110645907},"81":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":6,"docs":{"18":{"tf":2.0},"47":{"tf":1.0},"48":{"tf":1.0},"49":{"tf":2.0},"50":{"tf":1.0},"51":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":7,"docs":{"104":{"tf":1.4142135623730951},"110":{"tf":1.0},"113":{"tf":1.4142135623730951},"116":{"tf":3.7416573867739413},"117":{"tf":2.449489742783178},"121":{"tf":1.4142135623730951},"8":{"tf":1.0}},"e":{"(":{"$":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"110":{"tf":1.0}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"106":{"tf":1.0},"107":{"tf":1.0},"8":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"116":{"tf":1.0},"117":{"tf":1.4142135623730951}},"v":{"df":1,"docs":{"116":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"121":{"tf":1.4142135623730951}}}}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"91":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"i":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"62":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":1,"docs":{"84":{"tf":1.4142135623730951}},"s":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"c":{"df":1,"docs":{"34":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"91":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"48":{"tf":2.0}}}},"df":0,"docs":{}}},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"83":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"(":{"$":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"_":{"df":1,"docs":{"58":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"57":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"57":{"tf":1.7320508075688772}}}}}}},"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"57":{"tf":2.0},"58":{"tf":2.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"n":{"df":2,"docs":{"39":{"tf":1.0},"88":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":4,"docs":{"57":{"tf":3.0},"58":{"tf":1.4142135623730951},"8":{"tf":1.0},"93":{"tf":1.0}}},"y":{"(":{"4":{")":{".":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"(":{")":{".":{"0":{"df":2,"docs":{"57":{"tf":2.0},"58":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"3":{"2":{"df":2,"docs":{"57":{"tf":2.0},"58":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"+":{"1":{"df":1,"docs":{"88":{"tf":1.0}}},"2":{"df":1,"docs":{"88":{"tf":1.0}}},"3":{"df":1,"docs":{"88":{"tf":1.0}}},"df":0,"docs":{}},".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"88":{"tf":6.557438524302}}}}}},"df":0,"docs":{}},"0":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"23":{"tf":2.0}}}}}}},"df":0,"docs":{}},"1":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"23":{"tf":2.0}}}}}}},"df":0,"docs":{}},"2":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"23":{"tf":1.0}}}}}}},"df":1,"docs":{"23":{"tf":1.0}}},":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":10,"docs":{"11":{"tf":1.0},"16":{"tf":2.23606797749979},"23":{"tf":2.0},"24":{"tf":1.7320508075688772},"43":{"tf":1.0},"46":{"tf":1.0},"54":{"tf":1.4142135623730951},"86":{"tf":2.0},"88":{"tf":3.7416573867739413},"93":{"tf":1.0}}}}}}},"a":{"c":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"!":{"(":{"$":{"(":{"$":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"60":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"60":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"60":{"tf":1.4142135623730951}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"60":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"60":{"tf":3.1622776601683795}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"d":{"d":{"df":0,"docs":{},"y":{"b":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"35":{"tf":1.0},"36":{"tf":1.0},"44":{"tf":1.0}}}}},"df":13,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"16":{"tf":2.449489742783178},"17":{"tf":1.4142135623730951},"21":{"tf":2.8284271247461903},"22":{"tf":2.8284271247461903},"23":{"tf":2.6457513110645907},"24":{"tf":2.6457513110645907},"54":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772},"86":{"tf":1.7320508075688772},"88":{"tf":5.830951894845301},"93":{"tf":1.0}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":2.0}},"i":{"df":1,"docs":{"91":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.0}}}}}}},"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.0},"38":{"tf":1.0}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"41":{"tf":1.0},"88":{"tf":1.0}}}}}},"n":{"d":{"df":1,"docs":{"5":{"tf":1.4142135623730951}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"107":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"107":{"tf":2.0}},"e":{"df":0,"docs":{},"r":{"!":{"(":{"@":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"107":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":4,"docs":{"107":{"tf":2.6457513110645907},"117":{"tf":1.0},"31":{"tf":1.0},"98":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}},"、":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"116":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"101":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"[":{"df":0,"docs":{},"e":{"0":{"4":{"2":{"4":{"df":1,"docs":{"57":{"tf":1.0}}},"5":{"df":2,"docs":{"23":{"tf":2.0},"54":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":8,"docs":{"17":{"tf":1.0},"22":{"tf":1.0},"41":{"tf":1.4142135623730951},"45":{"tf":1.0},"48":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0},"68":{"tf":1.7320508075688772}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":2,"docs":{"79":{"tf":1.4142135623730951},"99":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"x":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"51":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":3,"docs":{"12":{"tf":1.0},"18":{"tf":1.0},"78":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"91":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"83":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":9,"docs":{"11":{"tf":1.0},"120":{"tf":1.0},"23":{"tf":1.4142135623730951},"24":{"tf":1.0},"38":{"tf":1.0},"47":{"tf":1.0},"60":{"tf":2.23606797749979},"88":{"tf":2.449489742783178},"99":{"tf":2.6457513110645907}}},"df":0,"docs":{},"s":{"df":6,"docs":{"14":{"tf":2.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"18":{"tf":1.0},"47":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"57":{"tf":1.0},"58":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"63":{"tf":1.0}}}}},"r":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"29":{"tf":1.0}}}}}}},"df":7,"docs":{"11":{"tf":1.0},"120":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"27":{"tf":1.0},"29":{"tf":1.7320508075688772},"44":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":9,"docs":{"16":{"tf":1.0},"18":{"tf":1.0},"21":{"tf":1.0},"29":{"tf":1.7320508075688772},"33":{"tf":1.0},"40":{"tf":1.0},"48":{"tf":1.0},"52":{"tf":1.0},"8":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"3":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"df":9,"docs":{"11":{"tf":1.0},"23":{"tf":1.0},"31":{"tf":1.4142135623730951},"38":{"tf":1.0},"69":{"tf":1.7320508075688772},"75":{"tf":1.0},"76":{"tf":2.23606797749979},"77":{"tf":1.0},"99":{"tf":1.0}}}}}}}},"f":{"3":{"2":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{")":{".":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"(":{"1":{"0":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"[":{"df":0,"docs":{},"i":{"df":1,"docs":{"24":{"tf":1.0}}}},"_":{"df":0,"docs":{},"u":{"1":{"2":{"8":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"85":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"85":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"85":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"4":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"85":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"85":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"{":{"0":{"df":1,"docs":{"20":{"tf":1.0}}},"1":{"df":1,"docs":{"20":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"20":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":1,"docs":{"20":{"tf":1.7320508075688772}}}}},"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"52":{"tf":1.0},"81":{"tf":1.0}}}},"l":{"df":0,"docs":{},"s":{"df":2,"docs":{"101":{"tf":1.0},"84":{"tf":1.0}}}}},"df":2,"docs":{"17":{"tf":1.4142135623730951},"85":{"tf":2.8284271247461903}},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":5,"docs":{"121":{"tf":2.23606797749979},"18":{"tf":1.0},"23":{"tf":1.0},"47":{"tf":1.0},"78":{"tf":1.0}},"e":{"(":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":3,"docs":{"78":{"tf":1.0},"79":{"tf":1.0},"81":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"61":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":7,"docs":{"18":{"tf":1.0},"47":{"tf":1.0},"48":{"tf":1.0},"49":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"d":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":3,"docs":{"11":{"tf":1.0},"38":{"tf":1.0},"99":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"60":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"5":{"tf":1.0}}}}}},"i":{"b":{"(":{"1":{"0":{"0":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":1,"docs":{"8":{"tf":1.7320508075688772}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"(":{"1":{"0":{"df":4,"docs":{"21":{"tf":2.0},"22":{"tf":2.0},"23":{"tf":1.7320508075688772},"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"_":{"1":{"0":{"0":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"21":{"tf":2.0},"22":{"tf":2.23606797749979},"23":{"tf":2.8284271247461903},"24":{"tf":1.0}},"o":{"df":0,"docs":{},"n":{"a":{"c":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"20":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":1,"docs":{"106":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"106":{"tf":1.0}},"e":{":":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"106":{"tf":1.0},"107":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"106":{"tf":1.4142135623730951}}},"y":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"i":{"df":1,"docs":{"106":{"tf":1.4142135623730951}},"s":{":":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":3,"docs":{"106":{"tf":2.0},"107":{"tf":2.0},"117":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"101":{"tf":1.0}}}},"d":{"df":2,"docs":{"23":{"tf":2.0},"54":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":1,"docs":{"41":{"tf":1.0}}}},"r":{"df":1,"docs":{"83":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"41":{"tf":1.0},"88":{"tf":2.0}}}}}},"n":{"df":73,"docs":{"10":{"tf":1.7320508075688772},"101":{"tf":1.0},"102":{"tf":1.0},"104":{"tf":2.0},"106":{"tf":1.0},"107":{"tf":1.0},"11":{"tf":1.4142135623730951},"111":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.4142135623730951},"115":{"tf":1.7320508075688772},"116":{"tf":1.0},"117":{"tf":1.0},"120":{"tf":1.0},"15":{"tf":2.0},"17":{"tf":1.7320508075688772},"21":{"tf":2.0},"22":{"tf":2.8284271247461903},"23":{"tf":4.47213595499958},"24":{"tf":2.6457513110645907},"28":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"38":{"tf":2.0},"40":{"tf":1.0},"41":{"tf":2.0},"43":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951},"49":{"tf":1.0},"5":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"55":{"tf":1.4142135623730951},"57":{"tf":3.1622776601683795},"58":{"tf":1.4142135623730951},"60":{"tf":1.0},"61":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.4142135623730951},"67":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.7320508075688772},"70":{"tf":1.7320508075688772},"75":{"tf":1.0},"76":{"tf":1.4142135623730951},"77":{"tf":1.0},"79":{"tf":1.0},"8":{"tf":1.7320508075688772},"81":{"tf":1.4142135623730951},"83":{"tf":1.4142135623730951},"84":{"tf":1.0},"85":{"tf":3.1622776601683795},"86":{"tf":1.7320508075688772},"88":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.7320508075688772},"93":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.7320508075688772},"97":{"tf":1.0},"98":{"tf":1.0},"99":{"tf":1.7320508075688772}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"u":{"3":{"2":{"df":1,"docs":{"37":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"22":{"tf":1.0},"44":{"tf":1.0},"57":{"tf":1.4142135623730951}}}}}},"o":{"!":{"(":{"@":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"86":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"114":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"81":{"tf":1.0}}}}}},"df":0,"docs":{}},"(":{"_":{"df":1,"docs":{"10":{"tf":1.0}}},"b":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"104":{"tf":1.0},"34":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},":":{":":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"40":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"81":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":18,"docs":{"10":{"tf":2.8284271247461903},"106":{"tf":1.7320508075688772},"107":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.4142135623730951},"38":{"tf":2.23606797749979},"41":{"tf":1.4142135623730951},"48":{"tf":2.449489742783178},"49":{"tf":1.4142135623730951},"5":{"tf":1.0},"55":{"tf":1.0},"81":{"tf":1.7320508075688772},"86":{"tf":2.449489742783178}},"、":{"'":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":0,"docs":{}}}},":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"d":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"、":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"<":{"_":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"8":{"tf":1.0}}}}},"df":0,"docs":{}},"df":2,"docs":{"104":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"23":{"tf":2.0},"54":{"tf":1.0},"57":{"tf":1.0}}},"df":0,"docs":{}},"r":{"!":{"(":{")":{"df":0,"docs":{},"、":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"15":{"tf":1.7320508075688772},"24":{"tf":2.23606797749979},"54":{"tf":2.23606797749979},"9":{"tf":2.449489742783178}}}}},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"126":{"tf":1.0},"16":{"tf":1.0},"27":{"tf":1.0}}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"$":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"121":{"tf":1.0}},"i":{"df":1,"docs":{"10":{"tf":1.0}}}}},"n":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"29":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"104":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":3,"docs":{"31":{"tf":1.0},"57":{"tf":1.0},"8":{"tf":1.0}}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{".":{"a":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"29":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"g":{":":{":":{"<":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{">":{":":{":":{"c":{"df":1,"docs":{"37":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"b":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"!":{"(":{"4":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"84":{"tf":1.0}}}}}},"t":{"df":2,"docs":{"24":{"tf":1.4142135623730951},"54":{"tf":1.4142135623730951}}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"115":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"d":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":2,"docs":{"23":{"tf":2.23606797749979},"24":{"tf":2.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":4,"docs":{"11":{"tf":1.0},"16":{"tf":1.0},"33":{"tf":1.0},"50":{"tf":1.0}}}},"p":{"df":3,"docs":{"38":{"tf":1.4142135623730951},"55":{"tf":1.7320508075688772},"57":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"1":{"df":1,"docs":{"117":{"tf":1.0}}},"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{":":{":":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"55":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"55":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"117":{"tf":1.0},"55":{"tf":2.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"22":{"tf":1.0},"5":{"tf":1.0}}}}},"i":{"df":2,"docs":{"70":{"tf":2.0},"88":{"tf":2.0}},"t":{"df":1,"docs":{"41":{"tf":1.0}}}},"o":{"df":1,"docs":{"84":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"34":{"tf":1.0}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"!":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"5":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":1,"docs":{"83":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"123":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":4,"docs":{"10":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.7320508075688772},"81":{"tf":1.7320508075688772}}}}}}}},"i":{"2":{":":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"17":{"tf":1.4142135623730951},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"17":{"tf":2.0},"45":{"tf":1.0}}},"3":{"2":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"104":{"tf":1.4142135623730951},"106":{"tf":1.4142135623730951}}},"df":0,"docs":{}},":":{"df":0,"docs":{},"i":{"d":{"df":5,"docs":{"17":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"57":{"tf":2.23606797749979}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"93":{"tf":1.0}}}}}}},"c":{"df":0,"docs":{},"y":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"30":{"tf":1.0},"41":{"tf":2.0}}},"df":0,"docs":{}}},"df":17,"docs":{"104":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":2.0},"27":{"tf":1.0},"30":{"tf":2.23606797749979},"32":{"tf":1.0},"41":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"46":{"tf":1.0},"49":{"tf":1.7320508075688772},"52":{"tf":1.0},"56":{"tf":1.7320508075688772},"81":{"tf":1.0},"83":{"tf":1.0},"98":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":8,"docs":{"16":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0},"46":{"tf":1.4142135623730951},"5":{"tf":1.0},"57":{"tf":1.4142135623730951},"63":{"tf":1.0},"8":{"tf":1.0}}}}},"s":{":":{":":{"_":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"98":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"98":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"、":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"27":{"tf":1.0}}}}}}}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"、":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"44":{"tf":1.0}}}}}},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"$":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"18":{"tf":1.0},"47":{"tf":1.0},"52":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"<":{"'":{"a":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"120":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"23":{"tf":2.23606797749979},"24":{"tf":1.4142135623730951},"31":{"tf":1.0},"40":{"tf":1.0},"57":{"tf":2.0},"58":{"tf":1.0},"8":{"tf":1.0},"81":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"63":{"tf":1.0}}}}}}},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"84":{"tf":1.4142135623730951}}}}}}}}},"d":{":":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"24":{"tf":2.0},"7":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"(":{"0":{"df":2,"docs":{"18":{"tf":1.0},"50":{"tf":1.4142135623730951}}},"1":{"df":3,"docs":{"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"18":{"tf":1.0},"47":{"tf":1.0},"50":{"tf":2.0}}}}}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"22":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"<":{"'":{"b":{">":{"(":{"&":{"'":{"b":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}},"df":8,"docs":{"18":{"tf":1.0},"22":{"tf":3.0},"23":{"tf":3.4641016151377544},"24":{"tf":2.449489742783178},"50":{"tf":1.4142135623730951},"51":{"tf":1.0},"52":{"tf":1.0},"7":{"tf":1.0}},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"<":{"'":{"a":{"df":3,"docs":{"22":{"tf":2.449489742783178},"23":{"tf":2.8284271247461903},"24":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"22":{"tf":2.0},"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951}},"{":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}}}}},"i":{"c":{"df":1,"docs":{"50":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"117":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":2,"docs":{"84":{"tf":1.0},"88":{"tf":1.0}}}}}}},"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"!":{"(":{"@":{"a":{"c":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"88":{"tf":3.7416573867739413}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"[":{"0":{"df":1,"docs":{"88":{"tf":1.4142135623730951}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"88":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"88":{"tf":4.47213595499958}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":7,"docs":{"21":{"tf":2.0},"22":{"tf":1.4142135623730951},"23":{"tf":2.449489742783178},"24":{"tf":1.4142135623730951},"84":{"tf":1.0},"88":{"tf":1.0},"9":{"tf":1.4142135623730951}},"i":{"df":2,"docs":{"11":{"tf":1.4142135623730951},"9":{"tf":1.0}}},"s":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":5,"docs":{"21":{"tf":4.123105625617661},"22":{"tf":2.0},"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"104":{"tf":1.0},"21":{"tf":1.7320508075688772},"22":{"tf":1.4142135623730951},"23":{"tf":2.0},"24":{"tf":1.4142135623730951},"46":{"tf":2.0}},"e":{"(":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"y":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{"df":0,"docs":{},"i":{"d":{"df":4,"docs":{"49":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0}}},"df":0,"docs":{}}},"df":3,"docs":{"49":{"tf":2.449489742783178},"51":{"tf":1.0},"55":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":7,"docs":{"107":{"tf":1.4142135623730951},"110":{"tf":1.0},"112":{"tf":1.0},"114":{"tf":1.4142135623730951},"21":{"tf":1.4142135623730951},"88":{"tf":1.0},"91":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"27":{"tf":1.0},"39":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"df":1,"docs":{"16":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"86":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"40":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"v":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"57":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":4,"docs":{"0":{"tf":1.4142135623730951},"18":{"tf":1.0},"47":{"tf":1.0},"78":{"tf":1.0}}}}},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"41":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"31":{"tf":1.0}}}}}}},"df":14,"docs":{"103":{"tf":1.7320508075688772},"14":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"23":{"tf":2.23606797749979},"24":{"tf":1.4142135623730951},"27":{"tf":1.0},"31":{"tf":3.1622776601683795},"38":{"tf":1.7320508075688772},"55":{"tf":1.4142135623730951},"77":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.0}},"、":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"21":{"tf":1.0}}}}}}}},"r":{"df":6,"docs":{"20":{"tf":1.4142135623730951},"21":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"23":{"tf":2.8284271247461903},"24":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951}}}}}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"91":{"tf":1.0}}}}}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}},"y":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":4,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"5":{"tf":1.0},"57":{"tf":2.23606797749979}}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"83":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"83":{"tf":1.7320508075688772}}}}}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"32":{"tf":1.0},"54":{"tf":1.0}}}}},"c":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"5":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"83":{"tf":2.449489742783178}}}},"df":0,"docs":{}},"z":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"8":{"tf":1.0}}},"k":{"df":1,"docs":{"66":{"tf":1.0}}}},"df":0,"docs":{},"n":{"(":{"&":{"[":{"$":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"c":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"!":{"(":{"$":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"97":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":1,"docs":{"51":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"51":{"tf":1.0},"97":{"tf":1.0}},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"(":{"0":{"df":2,"docs":{"18":{"tf":1.0},"51":{"tf":1.0}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"18":{"tf":1.0},"47":{"tf":1.0},"51":{"tf":2.0}}}}}}},"df":0,"docs":{}},"df":3,"docs":{"18":{"tf":1.0},"51":{"tf":1.0},"97":{"tf":1.0}}}}}},"t":{"'":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{},"s":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"51":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"36":{"tf":1.0}}}}},"x":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.4142135623730951}}}}}},"h":{"df":3,"docs":{"6":{"tf":1.0},"7":{"tf":2.0},"9":{"tf":1.7320508075688772}}},"i":{"b":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"109":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":4,"docs":{"109":{"tf":1.0},"25":{"tf":1.7320508075688772},"62":{"tf":1.7320508075688772},"76":{"tf":1.4142135623730951}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"2":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":5,"docs":{"16":{"tf":1.0},"27":{"tf":1.0},"32":{"tf":2.6457513110645907},"41":{"tf":1.0},"46":{"tf":1.0}},"e":{":":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"32":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"104":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{":":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":9,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"22":{"tf":1.0},"27":{"tf":1.0},"29":{"tf":1.0},"33":{"tf":2.449489742783178},"35":{"tf":1.0},"36":{"tf":1.0},"5":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"9":{"tf":2.0}}}}},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"o":{"c":{"a":{"df":0,"docs":{},"l":{"df":6,"docs":{"10":{"tf":3.605551275463989},"120":{"tf":2.0},"22":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0},"54":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"x":{"!":{"(":{"$":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"61":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"61":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"84":{"tf":1.0}}}}}}}}}}},"u":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"62":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"m":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"46":{"tf":1.0}}},"df":0,"docs":{}}}}},"a":{"c":{"df":3,"docs":{"25":{"tf":1.4142135623730951},"69":{"tf":1.4142135623730951},"76":{"tf":2.6457513110645907}},"r":{"df":0,"docs":{},"o":{"2":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"119":{"tf":2.0},"120":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"119":{"tf":2.6457513110645907},"121":{"tf":1.0}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":6,"docs":{"25":{"tf":1.7320508075688772},"55":{"tf":1.7320508075688772},"72":{"tf":1.0},"76":{"tf":2.23606797749979},"80":{"tf":1.0},"86":{"tf":2.0}}}}}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"62":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":76,"docs":{"10":{"tf":2.0},"101":{"tf":2.0},"102":{"tf":1.0},"104":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":1.0},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"14":{"tf":2.6457513110645907},"15":{"tf":1.7320508075688772},"16":{"tf":2.23606797749979},"17":{"tf":1.7320508075688772},"21":{"tf":1.7320508075688772},"22":{"tf":2.449489742783178},"23":{"tf":3.605551275463989},"24":{"tf":2.6457513110645907},"25":{"tf":1.7320508075688772},"26":{"tf":1.0},"28":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"38":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":2.23606797749979},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":2.0},"48":{"tf":2.0},"49":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"54":{"tf":1.4142135623730951},"55":{"tf":1.7320508075688772},"57":{"tf":2.449489742783178},"58":{"tf":1.4142135623730951},"60":{"tf":1.0},"61":{"tf":1.0},"62":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.4142135623730951},"67":{"tf":1.4142135623730951},"68":{"tf":2.0},"69":{"tf":2.0},"70":{"tf":2.0},"72":{"tf":1.0},"73":{"tf":1.0},"75":{"tf":1.4142135623730951},"76":{"tf":1.7320508075688772},"77":{"tf":1.4142135623730951},"78":{"tf":1.0},"79":{"tf":2.0},"8":{"tf":2.449489742783178},"80":{"tf":1.0},"81":{"tf":2.0},"83":{"tf":2.0},"84":{"tf":1.7320508075688772},"85":{"tf":1.4142135623730951},"86":{"tf":2.23606797749979},"88":{"tf":1.7320508075688772},"90":{"tf":1.7320508075688772},"91":{"tf":1.0},"93":{"tf":2.23606797749979},"95":{"tf":1.4142135623730951},"96":{"tf":2.23606797749979},"97":{"tf":1.4142135623730951},"98":{"tf":1.0},"99":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"s":{"df":10,"docs":{"11":{"tf":1.0},"23":{"tf":1.0},"38":{"tf":1.0},"69":{"tf":2.6457513110645907},"70":{"tf":1.0},"71":{"tf":1.0},"75":{"tf":2.0},"76":{"tf":2.0},"77":{"tf":1.4142135623730951},"99":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"76":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":29,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"104":{"tf":1.0},"106":{"tf":1.0},"109":{"tf":2.449489742783178},"117":{"tf":1.0},"119":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"121":{"tf":1.0},"125":{"tf":1.0},"18":{"tf":1.0},"22":{"tf":1.0},"3":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"5":{"tf":1.4142135623730951},"57":{"tf":1.7320508075688772},"58":{"tf":1.4142135623730951},"60":{"tf":1.4142135623730951},"75":{"tf":1.0},"76":{"tf":1.4142135623730951},"78":{"tf":1.4142135623730951},"79":{"tf":2.8284271247461903},"8":{"tf":1.7320508075688772},"80":{"tf":2.449489742783178},"81":{"tf":2.449489742783178},"88":{"tf":1.0},"9":{"tf":1.0},"99":{"tf":1.0}}}},"s":{":":{":":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"76":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"22":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":63,"docs":{"10":{"tf":1.4142135623730951},"101":{"tf":1.0},"102":{"tf":1.0},"104":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":1.0},"11":{"tf":1.4142135623730951},"17":{"tf":1.7320508075688772},"21":{"tf":1.4142135623730951},"22":{"tf":1.7320508075688772},"23":{"tf":3.3166247903554},"24":{"tf":1.7320508075688772},"25":{"tf":1.0},"28":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"38":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":2.0},"43":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951},"49":{"tf":1.0},"5":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"57":{"tf":2.23606797749979},"58":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.4142135623730951},"67":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.7320508075688772},"70":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":1.4142135623730951},"77":{"tf":1.0},"79":{"tf":1.0},"8":{"tf":1.4142135623730951},"81":{"tf":1.0},"83":{"tf":1.4142135623730951},"84":{"tf":1.0},"86":{"tf":1.7320508075688772},"88":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"93":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.7320508075688772},"97":{"tf":1.0},"98":{"tf":1.0},"99":{"tf":1.7320508075688772}}}},"k":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"10":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"!":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"57":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"57":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"!":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"57":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"57":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"91":{"tf":1.0}}},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"114":{"tf":1.0}}}}},"n":{"a":{"df":1,"docs":{"114":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":1,"docs":{"51":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}},"s":{"!":{"(":{"$":{"df":1,"docs":{"46":{"tf":1.0}}},"(":{"c":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"df":1,"docs":{"46":{"tf":1.0}}},"5":{"df":1,"docs":{"46":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":8,"docs":{"11":{"tf":1.0},"23":{"tf":2.23606797749979},"41":{"tf":1.0},"48":{"tf":1.0},"5":{"tf":1.0},"68":{"tf":1.7320508075688772},"8":{"tf":1.4142135623730951},"86":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"103":{"tf":1.0},"14":{"tf":2.0},"15":{"tf":2.449489742783178},"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"79":{"tf":1.0}}}}}},"df":0,"docs":{}},"y":{"b":{"df":1,"docs":{"83":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"b":{"df":0,"docs":{},"e":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}},"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":4,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"123":{"tf":1.4142135623730951},"38":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":3,"docs":{"101":{"tf":1.4142135623730951},"12":{"tf":1.0},"14":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":3,"docs":{"23":{"tf":3.4641016151377544},"24":{"tf":2.8284271247461903},"25":{"tf":1.0}}}}}},"df":4,"docs":{"21":{"tf":2.23606797749979},"22":{"tf":2.23606797749979},"23":{"tf":3.0},"24":{"tf":2.0}}},"t":{"a":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"df":4,"docs":{"104":{"tf":1.0},"106":{"tf":1.7320508075688772},"107":{"tf":1.0},"34":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}},"df":6,"docs":{"104":{"tf":1.0},"106":{"tf":1.7320508075688772},"16":{"tf":1.0},"17":{"tf":1.0},"27":{"tf":1.0},"34":{"tf":2.23606797749979}},"v":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"126":{"tf":1.0},"16":{"tf":1.4142135623730951},"18":{"tf":1.0},"27":{"tf":1.0},"52":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"105":{"tf":1.0},"57":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"83":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"41":{"tf":1.0}}}},"t":{"df":1,"docs":{"2":{"tf":1.0}}},"x":{"df":3,"docs":{"122":{"tf":1.0},"54":{"tf":1.0},"81":{"tf":1.0}},"e":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"84":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"!":{"(":{"$":{"(":{"$":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"84":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"d":{"df":9,"docs":{"55":{"tf":1.0},"65":{"tf":1.7320508075688772},"66":{"tf":2.449489742783178},"67":{"tf":1.7320508075688772},"68":{"tf":1.0},"69":{"tf":3.0},"71":{"tf":1.7320508075688772},"75":{"tf":1.0},"76":{"tf":1.0}},"u":{"df":0,"docs":{},"l":{"df":2,"docs":{"31":{"tf":1.0},"57":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"70":{"tf":1.4142135623730951}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":2,"docs":{"101":{"tf":2.23606797749979},"102":{"tf":2.0}}}}},"df":0,"docs":{}}}}},"u":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"91":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":1,"docs":{"9":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":3,"docs":{"22":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0}},"y":{"_":{"a":{"d":{"d":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"n":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"39":{"tf":1.0},"84":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"0":{"df":1,"docs":{"57":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":1,"docs":{"57":{"tf":1.4142135623730951}}}}}}},"df":8,"docs":{"10":{"tf":1.0},"17":{"tf":1.0},"22":{"tf":2.449489742783178},"23":{"tf":3.1622776601683795},"24":{"tf":2.0},"35":{"tf":1.0},"36":{"tf":1.0},"57":{"tf":2.6457513110645907}}}},"y":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"113":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"88":{"tf":1.7320508075688772}}}}},"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"112":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"111":{"tf":1.0}}}}}}}},":":{"df":0,"docs":{},"i":{"d":{"df":4,"docs":{"104":{"tf":1.0},"106":{"tf":1.7320508075688772},"107":{"tf":1.0},"84":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":12,"docs":{"104":{"tf":1.0},"106":{"tf":2.0},"107":{"tf":1.0},"120":{"tf":1.7320508075688772},"14":{"tf":1.0},"16":{"tf":1.0},"57":{"tf":1.0},"7":{"tf":2.23606797749979},"8":{"tf":2.23606797749979},"81":{"tf":2.23606797749979},"84":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}},"!":{"$":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"110":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"df":8,"docs":{"101":{"tf":2.449489742783178},"102":{"tf":1.0},"11":{"tf":1.0},"21":{"tf":2.449489742783178},"22":{"tf":2.6457513110645907},"23":{"tf":3.3166247903554},"88":{"tf":1.7320508075688772},"97":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"w":{"df":2,"docs":{"22":{"tf":1.0},"81":{"tf":1.0}}},"x":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"21":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"21":{"tf":2.23606797749979},"22":{"tf":2.6457513110645907},"23":{"tf":3.4641016151377544},"24":{"tf":2.449489742783178}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"106":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":7,"docs":{"11":{"tf":1.0},"23":{"tf":1.4142135623730951},"38":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"88":{"tf":1.0},"99":{"tf":1.0}}}}}}}},"o":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":2,"docs":{"46":{"tf":2.0},"8":{"tf":1.0}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"d":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"98":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":1,"docs":{"41":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":2,"docs":{"22":{"tf":1.0},"8":{"tf":1.0}},"e":{"df":2,"docs":{"51":{"tf":1.0},"91":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":5,"docs":{"38":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":3.3166247903554},"88":{"tf":3.605551275463989},"99":{"tf":3.3166247903554}}},"h":{"df":1,"docs":{"14":{"tf":1.0}}}},"w":{"df":1,"docs":{"91":{"tf":1.0}}}},"t":{"df":3,"docs":{"22":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"98":{"tf":1.0}}}}}},"{":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"{":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"o":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"n":{"df":1,"docs":{"99":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"df":1,"docs":{"99":{"tf":1.0}}}},"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"_":{"df":0,"docs":{},"o":{"df":1,"docs":{"30":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"d":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":2,"docs":{"79":{"tf":1.4142135623730951},"99":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":3,"docs":{"22":{"tf":3.4641016151377544},"23":{"tf":4.0},"24":{"tf":2.8284271247461903}}}}}}},"g":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}},"h":{"df":1,"docs":{"84":{"tf":1.7320508075688772}}},"n":{"df":3,"docs":{"51":{"tf":1.0},"52":{"tf":1.7320508075688772},"70":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"27":{"tf":1.0}}}}},"df":4,"docs":{"18":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":2.0},"9":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"99":{"tf":1.0}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"41":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"<":{"$":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"23":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"21":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"6":{"4":{"df":3,"docs":{"21":{"tf":1.0},"22":{"tf":1.4142135623730951},"23":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":1,"docs":{"91":{"tf":1.4142135623730951}}}}},"df":5,"docs":{"22":{"tf":1.4142135623730951},"23":{"tf":1.4142135623730951},"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":2,"docs":{"46":{"tf":1.0},"83":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"49":{"tf":1.0},"51":{"tf":1.0}}},"df":0,"docs":{}}},"df":2,"docs":{"49":{"tf":2.449489742783178},"51":{"tf":1.0}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951},"88":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"91":{"tf":1.0}}}}}},"p":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"93":{"tf":1.0}}}},"df":0,"docs":{}}},"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"43":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"57":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}},"s":{"df":5,"docs":{"121":{"tf":1.7320508075688772},"22":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0},"6":{"tf":1.7320508075688772}},"e":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"121":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":1,"docs":{"8":{"tf":1.0}}}}},"t":{"df":1,"docs":{"91":{"tf":1.0}},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"54":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"22":{"tf":1.0}}}},"t":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":2,"docs":{"35":{"tf":1.0},"36":{"tf":1.0}}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"]":{"df":0,"docs":{},":":{"=":{">":{"df":0,"docs":{},"、":{",":{"df":0,"docs":{},"、":{"=":{"df":0,"docs":{},"、":{"df":0,"docs":{},"|":{"df":0,"docs":{},"、":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"、":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"44":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"27":{"tf":1.0},"36":{"tf":2.449489742783178}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":7,"docs":{"104":{"tf":1.4142135623730951},"16":{"tf":1.0},"27":{"tf":1.0},"35":{"tf":1.7320508075688772},"36":{"tf":2.0},"44":{"tf":1.0},"56":{"tf":1.0}},"h":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"37":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":8,"docs":{"16":{"tf":1.0},"27":{"tf":1.0},"34":{"tf":1.0},"37":{"tf":2.23606797749979},"44":{"tf":1.4142135623730951},"63":{"tf":1.4142135623730951},"80":{"tf":1.0},"91":{"tf":1.0}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":5,"docs":{"16":{"tf":1.0},"35":{"tf":2.0},"36":{"tf":2.6457513110645907},"57":{"tf":1.0},"8":{"tf":1.0}},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"35":{"tf":1.0},"36":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":1,"docs":{"93":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"83":{"tf":1.4142135623730951}}}}},"l":{"a":{"df":0,"docs":{},"y":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"11":{"tf":1.0},"38":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":1,"docs":{"60":{"tf":2.6457513110645907}}}}},"o":{"df":4,"docs":{"21":{"tf":2.23606797749979},"22":{"tf":2.0},"23":{"tf":3.0},"24":{"tf":2.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"107":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"21":{"tf":1.0},"22":{"tf":1.0}}}}}},"r":{"df":1,"docs":{"0":{"tf":1.0}},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"57":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":4,"docs":{"11":{"tf":1.0},"23":{"tf":1.0},"38":{"tf":1.0},"99":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":3,"docs":{"115":{"tf":1.0},"23":{"tf":1.4142135623730951},"24":{"tf":1.0}}},"y":{"=":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}},"f":{"(":{"\"":{"df":0,"docs":{},"o":{"df":0,"docs":{},"h":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"n":{"!":{"(":{"\"":{"#":{"1":{"df":1,"docs":{"83":{"tf":1.0}}},"2":{"df":1,"docs":{"83":{"tf":1.0}}},"3":{"df":1,"docs":{"83":{"tf":1.0}}},"4":{"df":1,"docs":{"83":{"tf":1.0}}},"5":{"df":1,"docs":{"83":{"tf":1.0}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":1,"docs":{"49":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"49":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":2,"docs":{"11":{"tf":1.0},"8":{"tf":1.0}}}}}},"i":{"df":1,"docs":{"8":{"tf":1.0}}}},"i":{"df":1,"docs":{"83":{"tf":1.0}}},"p":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"91":{"tf":1.0}}}}},"df":0,"docs":{}},"{":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"v":{"df":1,"docs":{"50":{"tf":1.0}}},"}":{"\\":{"df":0,"docs":{},"n":{"df":0,"docs":{},"{":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}},"{":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"计":{"df":0,"docs":{},"数":{"df":0,"docs":{},"结":{"df":0,"docs":{},"果":{"df":0,"docs":{},":":{"df":0,"docs":{},"{":{"df":0,"docs":{},"}":{"\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"102":{"tf":2.23606797749979}}}},"df":0,"docs":{}}}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"y":{"!":{"(":{"$":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"84":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":14,"docs":{"102":{"tf":2.0},"21":{"tf":2.0},"22":{"tf":2.0},"23":{"tf":2.0},"24":{"tf":1.4142135623730951},"41":{"tf":1.0},"46":{"tf":1.0},"51":{"tf":1.0},"57":{"tf":2.449489742783178},"58":{"tf":1.0},"8":{"tf":1.0},"83":{"tf":1.4142135623730951},"88":{"tf":1.0},"97":{"tf":1.0}}}}}},"v":{"df":1,"docs":{"44":{"tf":1.0}}}},"o":{"c":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"2":{"df":1,"docs":{"120":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":5,"docs":{"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0},"119":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"_":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"112":{"tf":1.0},"115":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"116":{"tf":1.0},"117":{"tf":1.0}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"l":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"116":{"tf":1.0},"117":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":7,"docs":{"109":{"tf":1.4142135623730951},"111":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":2.6457513110645907},"121":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":7,"docs":{"10":{"tf":1.0},"104":{"tf":1.0},"109":{"tf":2.23606797749979},"119":{"tf":3.605551275463989},"120":{"tf":1.0},"121":{"tf":1.4142135623730951},"8":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"8":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"107":{"tf":1.7320508075688772},"84":{"tf":1.0}}}}}},"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"88":{"tf":1.0}}}},"df":0,"docs":{}}}}},"u":{"b":{"(":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"106":{"tf":1.7320508075688772},"107":{"tf":1.7320508075688772},"41":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"41":{"tf":1.4142135623730951}}}}},"_":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"41":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":12,"docs":{"104":{"tf":1.0},"106":{"tf":1.4142135623730951},"111":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0},"41":{"tf":2.449489742783178},"55":{"tf":1.4142135623730951},"81":{"tf":1.4142135623730951}},"、":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"(":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{")":{"df":0,"docs":{},"、":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"80":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"39":{"tf":1.0},"88":{"tf":1.0}}}},"t":{"df":1,"docs":{"84":{"tf":1.0}}}},"y":{"df":1,"docs":{"123":{"tf":1.0}}}},"q":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"60":{"tf":1.0}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"41":{"tf":1.0},"63":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"114":{"tf":1.0}}}},"df":0,"docs":{},"z":{"df":2,"docs":{"27":{"tf":1.0},"54":{"tf":1.0}}}},"o":{"df":0,"docs":{},"t":{"df":3,"docs":{"113":{"tf":1.0},"120":{"tf":2.6457513110645907},"85":{"tf":1.0}}}},"u":{"df":0,"docs":{},"x":{"df":1,"docs":{"60":{"tf":1.0}}}},"x":{"df":1,"docs":{"106":{"tf":1.4142135623730951}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"57":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"83":{"tf":2.0}},"e":{"!":{"(":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"83":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"r":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":5,"docs":{"21":{"tf":4.242640687119285},"22":{"tf":2.0},"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}}}}}},"df":3,"docs":{"21":{"tf":1.7320508075688772},"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951}},"r":{"df":6,"docs":{"20":{"tf":1.0},"21":{"tf":3.1622776601683795},"22":{"tf":3.1622776601683795},"23":{"tf":4.0},"24":{"tf":3.0},"25":{"tf":2.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"!":{"(":{"df":0,"docs":{},"f":{"[":{"df":0,"docs":{},"i":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":0,"docs":{}}},"[":{"a":{"[":{"df":0,"docs":{},"n":{"df":4,"docs":{"21":{"tf":1.4142135623730951},"22":{"tf":2.0},"23":{"tf":2.6457513110645907},"24":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"df":0,"docs":{},"r":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"23":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"s":{"df":3,"docs":{"41":{"tf":1.0},"91":{"tf":1.0},"96":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"85":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}}},"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"99":{"tf":1.0}}}}},"df":1,"docs":{"8":{"tf":1.0}},"u":{"df":0,"docs":{},"x":{"df":1,"docs":{"16":{"tf":1.0}}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"83":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":1,"docs":{"104":{"tf":1.0}},"f":{"df":3,"docs":{"35":{"tf":1.0},"36":{"tf":1.0},"8":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":9,"docs":{"103":{"tf":1.0},"108":{"tf":1.0},"117":{"tf":1.0},"12":{"tf":1.0},"18":{"tf":1.0},"27":{"tf":1.0},"38":{"tf":1.0},"44":{"tf":1.0},"63":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"91":{"tf":1.0}}}}}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"38":{"tf":1.4142135623730951},"57":{"tf":1.0}}}}},"p":{"df":1,"docs":{"17":{"tf":1.7320508075688772}},"e":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"17":{"tf":2.0}}}}}},"df":4,"docs":{"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951},"49":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":5,"docs":{"17":{"tf":1.0},"49":{"tf":1.7320508075688772},"50":{"tf":1.0},"90":{"tf":1.0},"95":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}}}},"l":{"a":{"c":{"df":2,"docs":{"90":{"tf":1.0},"95":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"!":{"(":{"$":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":2,"docs":{"95":{"tf":1.0},"96":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"(":{"$":{"_":{"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"79":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":1,"docs":{"79":{"tf":1.0}}},"df":4,"docs":{"90":{"tf":1.7320508075688772},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":1,"docs":{"123":{"tf":2.0}}}},"s":{"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":2,"docs":{"60":{"tf":1.0},"61":{"tf":1.0}}}}},"df":1,"docs":{"107":{"tf":2.23606797749979}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"44":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"101":{"tf":1.0},"23":{"tf":2.0}}}}}},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"104":{"tf":1.0}}},"y":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"104":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"104":{"tf":1.0},"91":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"92":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"f":{"c":{"df":3,"docs":{"18":{"tf":1.0},"47":{"tf":1.0},"78":{"tf":1.0}},"s":{"#":{"1":{"5":{"8":{"4":{"df":3,"docs":{"18":{"tf":1.0},"47":{"tf":1.0},"78":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"h":{"df":3,"docs":{"6":{"tf":1.0},"7":{"tf":2.0},"9":{"tf":1.7320508075688772}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"0":{"df":1,"docs":{"14":{"tf":1.0}}},"1":{"df":1,"docs":{"14":{"tf":1.0}}},"df":4,"docs":{"58":{"tf":1.4142135623730951},"68":{"tf":1.7320508075688772},"86":{"tf":1.0},"91":{"tf":1.4142135623730951}},"n":{"df":1,"docs":{"14":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"#":{"3":{"9":{"4":{"1":{"2":{"df":1,"docs":{"78":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"3":{"5":{"2":{"7":{"df":2,"docs":{"18":{"tf":1.0},"47":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"5":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":9,"docs":{"11":{"tf":2.0},"22":{"tf":1.0},"23":{"tf":2.0},"38":{"tf":1.0},"60":{"tf":1.0},"86":{"tf":1.0},"88":{"tf":1.0},"96":{"tf":1.0},"99":{"tf":1.0}}},"df":46,"docs":{"0":{"tf":3.3166247903554},"10":{"tf":1.4142135623730951},"101":{"tf":1.0},"103":{"tf":2.0},"108":{"tf":1.4142135623730951},"109":{"tf":1.7320508075688772},"114":{"tf":1.0},"12":{"tf":1.4142135623730951},"120":{"tf":1.4142135623730951},"121":{"tf":2.449489742783178},"123":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"20":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"27":{"tf":1.4142135623730951},"29":{"tf":1.0},"3":{"tf":1.7320508075688772},"31":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":1.0},"44":{"tf":1.0},"47":{"tf":1.0},"5":{"tf":2.23606797749979},"54":{"tf":1.7320508075688772},"57":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"62":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"77":{"tf":1.0},"8":{"tf":2.8284271247461903},"83":{"tf":1.0},"86":{"tf":1.4142135623730951},"88":{"tf":1.7320508075688772},"90":{"tf":1.0},"93":{"tf":1.0}},",":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"44":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"y":{"df":0,"docs":{},"m":{"df":1,"docs":{"1":{"tf":1.0}}}}},"s":{"!":{"(":{"\"":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":1,"docs":{"93":{"tf":1.0}}}}}}},"a":{"df":1,"docs":{"2":{"tf":1.0}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":3,"docs":{"23":{"tf":2.8284271247461903},"54":{"tf":1.4142135623730951},"63":{"tf":1.7320508075688772}}}},"t":{"df":1,"docs":{"83":{"tf":1.0}}}}},"df":4,"docs":{"11":{"tf":1.4142135623730951},"17":{"tf":1.0},"91":{"tf":1.0},"93":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"0":{"df":1,"docs":{"57":{"tf":1.7320508075688772}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"21":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"21":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"[":{"df":0,"docs":{},"i":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":4,"docs":{"21":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}},"df":3,"docs":{"22":{"tf":2.23606797749979},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}},"p":{"df":0,"docs":{},"o":{"df":4,"docs":{"21":{"tf":2.8284271247461903},"22":{"tf":2.8284271247461903},"23":{"tf":4.0},"24":{"tf":2.8284271247461903}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"[":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{".":{"0":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"_":{":":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"57":{"tf":1.0},"58":{"tf":1.0}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"58":{"tf":1.0}}}},"df":0,"docs":{}}},"df":1,"docs":{"57":{"tf":1.0}}},"df":10,"docs":{"105":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":2.23606797749979},"23":{"tf":2.8284271247461903},"24":{"tf":2.0},"5":{"tf":1.7320508075688772},"56":{"tf":1.0},"57":{"tf":5.196152422706632},"58":{"tf":1.4142135623730951},"91":{"tf":1.0}}}},"m":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"38":{"tf":2.0}}}}}}},"df":0,"docs":{}}},"p":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"q":{":":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"24":{"tf":1.4142135623730951}}},"t":{"df":1,"docs":{"44":{"tf":1.0}}}},"h":{"a":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"68":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"32":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"w":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"(":{"df":1,"docs":{"91":{"tf":1.0}}},"df":1,"docs":{"91":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"!":{"(":{"$":{"(":{"$":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"61":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"61":{"tf":1.4142135623730951}},"l":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"e":{"df":2,"docs":{"122":{"tf":1.7320508075688772},"81":{"tf":1.4142135623730951}}}},"x":{"df":1,"docs":{"91":{"tf":1.0}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"91":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":4,"docs":{"22":{"tf":2.449489742783178},"23":{"tf":2.6457513110645907},"24":{"tf":2.0},"97":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"22":{"tf":1.0}}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"51":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"_":{"c":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":3,"docs":{"25":{"tf":1.4142135623730951},"92":{"tf":1.0},"96":{"tf":1.4142135623730951}}}}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"9":{"2":{"df":1,"docs":{"91":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"v":{"df":4,"docs":{"21":{"tf":2.0},"22":{"tf":2.0},"23":{"tf":2.8284271247461903},"24":{"tf":2.0}}}},"df":0,"docs":{}}}}},"s":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"91":{"tf":1.0}}}}}},"df":0,"docs":{}}},"_":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"77":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"!":{"(":{"\"":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"77":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"120":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"!":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"77":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"t":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"71":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"71":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"41":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"91":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"21":{"tf":1.4142135623730951},"46":{"tf":2.6457513110645907}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"120":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":3,"docs":{"109":{"tf":1.4142135623730951},"122":{"tf":3.1622776601683795},"53":{"tf":1.0}},"g":{"df":1,"docs":{"15":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":3,"docs":{"126":{"tf":1.0},"16":{"tf":1.0},"27":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"60":{"tf":1.0}}}}},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"0":{":":{"2":{"0":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{":":{"1":{"df":1,"docs":{"60":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{":":{"1":{"0":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}},"2":{"1":{"df":1,"docs":{"58":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{":":{"2":{"1":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"0":{":":{"3":{"1":{"df":1,"docs":{"88":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"2":{"4":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}},"3":{"3":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"8":{":":{"5":{"0":{"df":1,"docs":{"23":{"tf":1.0}}},"2":{"df":1,"docs":{"23":{"tf":1.0}}},"9":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}},"6":{"1":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},":":{"1":{"0":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"5":{":":{"4":{"5":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{":":{"5":{"df":1,"docs":{"99":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"84":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"16":{"tf":1.0},"21":{"tf":1.0},"38":{"tf":2.23606797749979},"54":{"tf":1.0},"8":{"tf":1.0}}}}}}},"i":{"c":{"df":5,"docs":{"106":{"tf":1.0},"23":{"tf":1.7320508075688772},"31":{"tf":1.0},"32":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}}}},"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{":":{":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"v":{"1":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"_":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"0":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"o":{":":{":":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"d":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{":":{":":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"v":{"1":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"11":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"(":{"0":{".":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"(":{"1":{"0":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"22":{"tf":2.0},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":4,"docs":{"22":{"tf":1.4142135623730951},"23":{"tf":2.0},"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"(":{"df":1,"docs":{"23":{"tf":1.0}},"i":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"2":{"0":{"1":{"8":{"df":3,"docs":{"11":{"tf":1.0},"38":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"v":{"1":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":4,"docs":{"11":{"tf":1.0},"23":{"tf":1.4142135623730951},"38":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":3,"docs":{"21":{"tf":1.0},"23":{"tf":4.123105625617661},"24":{"tf":3.1622776601683795}}},"m":{"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.0}}}}}}},"df":4,"docs":{"16":{"tf":1.0},"27":{"tf":1.0},"38":{"tf":3.0},"44":{"tf":1.0}}}},"r":{"df":3,"docs":{"106":{"tf":1.0},"23":{"tf":1.0},"91":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"(":{"\"":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}}}}}},"$":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"106":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":5,"docs":{"104":{"tf":1.0},"106":{"tf":1.0},"11":{"tf":1.7320508075688772},"88":{"tf":2.0},"90":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"46":{"tf":1.4142135623730951}}},"y":{"!":{"(":{"$":{"(":{"$":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"102":{"tf":2.0}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"102":{"tf":2.0}}}}},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"46":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":1,"docs":{"57":{"tf":1.0}},"n":{"df":0,"docs":{},"n":{"df":2,"docs":{"50":{"tf":1.0},"51":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"51":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"u":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"106":{"tf":2.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":14,"docs":{"10":{"tf":1.0},"106":{"tf":3.4641016151377544},"116":{"tf":1.0},"117":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":2.23606797749979},"23":{"tf":3.0},"24":{"tf":2.0},"31":{"tf":1.4142135623730951},"38":{"tf":2.0},"57":{"tf":2.0},"58":{"tf":1.0},"8":{"tf":1.0},"81":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"9":{"tf":1.0}}}}}},"df":0,"docs":{}}},"y":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":5,"docs":{"21":{"tf":1.0},"22":{"tf":2.0},"23":{"tf":2.0},"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}}}},"df":0,"docs":{}}},"u":{"b":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":5,"docs":{"79":{"tf":1.4142135623730951},"90":{"tf":1.4142135623730951},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0}}}}}}},"df":6,"docs":{"5":{"tf":1.4142135623730951},"79":{"tf":1.4142135623730951},"90":{"tf":1.4142135623730951},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"46":{"tf":1.4142135623730951}}}}}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"81":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"41":{"tf":1.0}}}}}},"w":{"a":{"df":0,"docs":{},"p":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":3,"docs":{"22":{"tf":2.449489742783178},"23":{"tf":2.8284271247461903},"24":{"tf":2.0}}}}}},"df":1,"docs":{"22":{"tf":1.0}}}},"df":0,"docs":{}},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"df":2,"docs":{"121":{"tf":2.0},"14":{"tf":1.0}},"t":{"a":{"df":0,"docs":{},"x":{"df":5,"docs":{"3":{"tf":1.0},"48":{"tf":1.0},"54":{"tf":1.0},"6":{"tf":1.0},"62":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"93":{"tf":1.0}}}}},"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":2,"docs":{"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951}}}}}},"t":{"df":0,"docs":{},"t":{"df":3,"docs":{"84":{"tf":1.7320508075688772},"91":{"tf":1.7320508075688772},"96":{"tf":3.0}}}}},"df":1,"docs":{"91":{"tf":1.0}}}}},"df":2,"docs":{"61":{"tf":1.0},"93":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"91":{"tf":1.4142135623730951}}}}}},"x":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"63":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"9":{"tf":1.0}}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"1":{"tf":1.0}}},"i":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"1":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"51":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":2,"docs":{"52":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":4,"docs":{"114":{"tf":1.0},"17":{"tf":1.4142135623730951},"49":{"tf":1.7320508075688772},"96":{"tf":1.0}},"s":{"_":{"df":0,"docs":{},"f":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":0,"docs":{}}}}},"l":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"_":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}},"e":{"!":{"(":{"b":{"df":1,"docs":{"114":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"(":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"116":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"117":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"114":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"117":{"tf":1.7320508075688772}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"_":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"114":{"tf":1.0},"115":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"116":{"tf":1.0},"117":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"c":{"df":1,"docs":{"1":{"tf":1.0}}},"d":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"21":{"tf":1.0},"22":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":12,"docs":{"107":{"tf":1.4142135623730951},"15":{"tf":1.0},"17":{"tf":1.0},"41":{"tf":1.0},"46":{"tf":1.4142135623730951},"5":{"tf":2.23606797749979},"58":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":2.0},"8":{"tf":1.0},"83":{"tf":1.0},"91":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"2":{"df":1,"docs":{"119":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":5,"docs":{"111":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":9,"docs":{"109":{"tf":1.0},"111":{"tf":1.4142135623730951},"112":{"tf":1.7320508075688772},"113":{"tf":2.449489742783178},"114":{"tf":2.0},"115":{"tf":1.7320508075688772},"116":{"tf":1.4142135623730951},"117":{"tf":1.4142135623730951},"122":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"39":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"84":{"tf":1.0}}},"l":{"df":2,"docs":{"11":{"tf":1.0},"38":{"tf":1.0}}}},"p":{"df":1,"docs":{"36":{"tf":1.0}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"120":{"tf":1.0}}}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":4,"docs":{"60":{"tf":2.0},"61":{"tf":1.0},"88":{"tf":1.0},"99":{"tf":1.0}},"s":{"!":{"(":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"60":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"60":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":4,"docs":{"60":{"tf":1.4142135623730951},"84":{"tf":2.6457513110645907},"88":{"tf":1.0},"99":{"tf":1.0}}},"k":{"df":3,"docs":{"18":{"tf":1.0},"47":{"tf":1.0},"78":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"107":{"tf":1.0},"38":{"tf":1.4142135623730951}}},"t":{"df":5,"docs":{"116":{"tf":1.0},"121":{"tf":1.0},"20":{"tf":1.0},"31":{"tf":1.0},"37":{"tf":1.0}}}},"n":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":6,"docs":{"103":{"tf":1.0},"14":{"tf":1.0},"18":{"tf":1.4142135623730951},"47":{"tf":1.0},"48":{"tf":1.4142135623730951},"79":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"r":{"df":1,"docs":{"47":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":3,"docs":{"6":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772},"8":{"tf":1.0}}}},"u":{"df":0,"docs":{},"e":{"df":5,"docs":{"101":{"tf":1.4142135623730951},"109":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"33":{"tf":1.0},"38":{"tf":1.4142135623730951}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"54":{"tf":1.0}}}}}},"t":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":5,"docs":{"104":{"tf":1.0},"107":{"tf":2.0},"41":{"tf":1.0},"61":{"tf":1.0},"85":{"tf":1.4142135623730951}}}}},"df":20,"docs":{"104":{"tf":1.0},"107":{"tf":2.23606797749979},"125":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"27":{"tf":1.4142135623730951},"39":{"tf":2.23606797749979},"41":{"tf":2.0},"46":{"tf":1.0},"48":{"tf":1.0},"56":{"tf":1.4142135623730951},"58":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":2.449489742783178},"85":{"tf":3.0},"86":{"tf":2.23606797749979},"88":{"tf":1.0},"89":{"tf":1.7320508075688772},"91":{"tf":2.23606797749979},"93":{"tf":1.7320508075688772}},"s":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":5,"docs":{"46":{"tf":1.0},"86":{"tf":1.7320508075688772},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0}}}}},"df":0,"docs":{}},"、":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"90":{"tf":1.0}}},"y":{"df":0,"docs":{},"s":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"90":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{"df":4,"docs":{"106":{"tf":1.0},"107":{"tf":1.0},"52":{"tf":1.0},"90":{"tf":1.0}},"e":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"w":{"df":0,"docs":{},"i":{"d":{"d":{"df":0,"docs":{},"l":{"df":2,"docs":{"126":{"tf":1.0},"99":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":2,"docs":{"52":{"tf":1.4142135623730951},"91":{"tf":1.0}}}},"y":{"df":6,"docs":{"16":{"tf":1.0},"21":{"tf":1.0},"27":{"tf":1.0},"40":{"tf":1.7320508075688772},"44":{"tf":1.4142135623730951},"96":{"tf":1.0}},"p":{"df":0,"docs":{},"e":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"40":{"tf":1.0}}}}},"df":8,"docs":{"104":{"tf":1.0},"109":{"tf":1.0},"21":{"tf":1.7320508075688772},"22":{"tf":2.23606797749979},"23":{"tf":2.8284271247461903},"24":{"tf":2.0},"31":{"tf":1.0},"40":{"tf":1.7320508075688772}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"37":{"tf":1.0}}}}},"df":0,"docs":{}}}},"、":{"1":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}}}},"u":{"1":{"2":{"8":{"df":1,"docs":{"85":{"tf":2.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"85":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"3":{"2":{"df":5,"docs":{"117":{"tf":1.4142135623730951},"40":{"tf":1.0},"8":{"tf":1.7320508075688772},"85":{"tf":2.8284271247461903},"98":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"6":{"4":{"df":5,"docs":{"21":{"tf":2.6457513110645907},"22":{"tf":4.123105625617661},"23":{"tf":3.605551275463989},"24":{"tf":1.0},"85":{"tf":2.0}}},"df":0,"docs":{}},"8":{"df":3,"docs":{"40":{"tf":1.0},"8":{"tf":1.0},"85":{"tf":1.4142135623730951}}},"df":1,"docs":{"17":{"tf":1.0}},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"101":{"tf":1.0}}}}},"b":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"84":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"66":{"tf":2.0},"67":{"tf":1.4142135623730951},"69":{"tf":2.0}}}}}},"o":{"df":1,"docs":{"123":{"tf":1.0}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"y":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"122":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"116":{"tf":1.0},"31":{"tf":1.0}}}},"t":{"df":4,"docs":{"106":{"tf":1.0},"107":{"tf":1.0},"38":{"tf":1.0},"55":{"tf":1.0}}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"38":{"tf":1.4142135623730951},"83":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"63":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"s":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"、":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"122":{"tf":1.0},"23":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"s":{"df":16,"docs":{"11":{"tf":1.0},"114":{"tf":1.4142135623730951},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"117":{"tf":1.4142135623730951},"119":{"tf":1.0},"22":{"tf":2.8284271247461903},"23":{"tf":3.605551275463989},"24":{"tf":2.449489742783178},"25":{"tf":1.4142135623730951},"31":{"tf":1.0},"38":{"tf":1.0},"55":{"tf":1.0},"77":{"tf":1.0},"8":{"tf":1.0},"99":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"10":{"tf":2.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"a":{"!":{"(":{"a":{"df":2,"docs":{"24":{"tf":1.7320508075688772},"54":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"24":{"tf":1.7320508075688772},"54":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"z":{"df":9,"docs":{"120":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":2.8284271247461903},"23":{"tf":5.656854249492381},"24":{"tf":2.8284271247461903},"25":{"tf":1.0},"88":{"tf":1.4142135623730951},"96":{"tf":1.0},"97":{"tf":1.0}}}}}},"v":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"9":{"tf":2.0}},"i":{"d":{"df":1,"docs":{"58":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":3,"docs":{"23":{"tf":2.0},"54":{"tf":1.0},"57":{"tf":1.4142135623730951}}}},"r":{"df":1,"docs":{"7":{"tf":2.23606797749979}},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":4,"docs":{"17":{"tf":1.0},"48":{"tf":1.0},"54":{"tf":1.0},"57":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"107":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":2,"docs":{"107":{"tf":2.8284271247461903},"117":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":2,"docs":{"17":{"tf":1.7320508075688772},"50":{"tf":1.0}},"e":{"c":{"!":{"[":{"0":{"df":0,"docs":{},"u":{"6":{"4":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"17":{"tf":1.0}},"s":{"!":{"[":{"1":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":2,"docs":{"17":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{},"y":{"df":0,"docs":{},"k":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"123":{"tf":1.0}}}}}}}},"i":{"df":6,"docs":{"104":{"tf":1.0},"106":{"tf":1.7320508075688772},"16":{"tf":1.0},"27":{"tf":1.0},"41":{"tf":3.0},"44":{"tf":1.0}},"s":{":":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":4,"docs":{"104":{"tf":1.0},"106":{"tf":1.7320508075688772},"107":{"tf":1.0},"41":{"tf":2.23606797749979}}}}},"_":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"41":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"!":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"41":{"tf":2.0}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"60":{"tf":2.23606797749979}}},"r":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"38":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":1,"docs":{"38":{"tf":1.4142135623730951}}}}},"df":1,"docs":{"17":{"tf":1.0}},"e":{"_":{"c":{"a":{"df":0,"docs":{},"n":{"_":{"d":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"77":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":1,"docs":{"15":{"tf":1.7320508075688772}}}}},"t":{"_":{"df":0,"docs":{},"i":{"df":2,"docs":{"46":{"tf":1.0},"57":{"tf":1.0}},"s":{"!":{"(":{"#":{"[":{"$":{"df":0,"docs":{},"m":{"df":1,"docs":{"46":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"46":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"57":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"91":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"60":{"tf":3.0}}}}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"22":{"tf":2.6457513110645907},"23":{"tf":2.8284271247461903},"24":{"tf":2.0}}}}},"df":0,"docs":{},"p":{"df":1,"docs":{"60":{"tf":1.0}}}},"p":{"df":2,"docs":{"105":{"tf":1.0},"108":{"tf":1.0}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"41":{"tf":1.0}}},"l":{"d":{"!":{"\"":{"df":0,"docs":{},"、":{"3":{".":{"1":{"4":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":4,"docs":{"11":{"tf":2.0},"33":{"tf":1.0},"77":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"2":{"df":2,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"s":{"df":2,"docs":{"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":3,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":2.0},"24":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"x":{"!":{"(":{"1":{"df":1,"docs":{"68":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"68":{"tf":1.7320508075688772}}},"3":{"df":1,"docs":{"68":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"7":{"df":1,"docs":{"61":{"tf":1.0}}},"8":{"df":1,"docs":{"61":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"7":{"df":0,"docs":{},"f":{"df":1,"docs":{"61":{"tf":1.0}}}},"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"12":{"tf":1.0}}}}}},"df":12,"docs":{"101":{"tf":1.7320508075688772},"17":{"tf":1.4142135623730951},"43":{"tf":1.0},"65":{"tf":2.0},"66":{"tf":3.0},"67":{"tf":2.449489742783178},"68":{"tf":1.7320508075688772},"69":{"tf":3.605551275463989},"70":{"tf":1.0},"75":{"tf":1.4142135623730951},"76":{"tf":3.872983346207417},"9":{"tf":1.7320508075688772}},"o":{"d":{"df":1,"docs":{"60":{"tf":1.0}}},"df":0,"docs":{}}},"y":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"99":{"tf":1.0}}}}}}}}},"df":8,"docs":{"12":{"tf":1.0},"17":{"tf":1.4142135623730951},"23":{"tf":2.449489742783178},"67":{"tf":2.23606797749979},"69":{"tf":3.0},"70":{"tf":2.0},"75":{"tf":1.4142135623730951},"76":{"tf":2.6457513110645907}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"5":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"1":{"tf":1.0}}}}}}},"z":{"df":5,"docs":{"17":{"tf":1.4142135623730951},"23":{"tf":2.0},"60":{"tf":1.4142135623730951},"88":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"101":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"28":{"tf":1.0},"38":{"tf":2.23606797749979}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"=":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"11":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"38":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"title":{"root":{"2":{".":{"0":{"df":1,"docs":{"78":{"tf":1.0}}},"df":0,"docs":{}},"0":{"1":{"5":{"df":1,"docs":{"74":{"tf":1.0}}},"8":{"df":1,"docs":{"77":{"tf":1.0}}},"df":0,"docs":{}},"2":{"1":{".":{"0":{"6":{"df":1,"docs":{"126":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"4":{"df":1,"docs":{"125":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":1,"docs":{"58":{"tf":1.0}}},"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"8":{"tf":1.0},"93":{"tf":1.0}}}}},"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"99":{"tf":1.0}}}},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"49":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":2,"docs":{"118":{"tf":1.0},"55":{"tf":1.0}}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"49":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"113":{"tf":1.0},"116":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"48":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":1,"docs":{"29":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"(":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"50":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"31":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"(":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"51":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"i":{"b":{"df":1,"docs":{"62":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"32":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"33":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"61":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"2":{"df":1,"docs":{"119":{"tf":1.0}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"76":{"tf":1.0}}}}}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"62":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"14":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"69":{"tf":1.0},"75":{"tf":1.0}}}}},"df":1,"docs":{"80":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"34":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"6":{"tf":1.0}}}},"t":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":1,"docs":{"35":{"tf":1.0}},"h":{"df":1,"docs":{"37":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"120":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"0":{"tf":1.0},"103":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"57":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"122":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"n":{"df":1,"docs":{"121":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"5":{"tf":1.0},"7":{"tf":1.0}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"60":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":1,"docs":{"7":{"tf":1.0}}}}},"t":{"df":3,"docs":{"39":{"tf":1.0},"84":{"tf":1.0},"91":{"tf":1.0}}},"w":{"df":0,"docs":{},"i":{"d":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"99":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"y":{"df":1,"docs":{"40":{"tf":1.0}}}},"v":{"df":0,"docs":{},"i":{"df":1,"docs":{"41":{"tf":1.0}}}}}}},"lang":"English","pipeline":["trimmer","stopWordFilter","stemmer"],"ref":"id","version":"0.9.5"},"results_options":{"limit_results":30,"teaser_word_count":30},"search_options":{"bool":"OR","expand":true,"fields":{"body":{"boost":1},"breadcrumbs":{"boost":1},"title":{"boost":2}}}} \ No newline at end of file diff --git a/syntax-extensions.html b/syntax-extensions.html new file mode 100644 index 0000000..710440f --- /dev/null +++ b/syntax-extensions.html @@ -0,0 +1,302 @@ + + + + + + 语法拓展 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

语法扩展

+

在讨论 Rust 的不同宏系统之前,有必要讨论一下构建它们的一般机制:语法扩展 。

+

要理解这一点,我们必须首先讨论编译器如何处理 Rust +源代码,以及构建用户自定义的宏和过程宏所基于的一般机制。

+
+

注意:本书将从现在开始,讨论 Rust 的所有不同宏类型时,使用术语“语法扩展” +(syntax extension),以减少与即将发布的声明宏 2.0 提案的可能存在的混淆,该提案使用了 macro 关键字。

+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/syntax-extensions/ast.html b/syntax-extensions/ast.html new file mode 100644 index 0000000..33d9818 --- /dev/null +++ b/syntax-extensions/ast.html @@ -0,0 +1,393 @@ + + + + + + AST 中的宏 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

AST 中的宏

+
+

译者注:牢记“宏”是声明宏和过程宏的统称,而“宏”只是一种“语法拓展”。AST 中的宏其实围绕着标记树。

+
+

如前所述,在 Rust 中,宏处理发生在 AST 生成之后。因此,调用宏的语法必须符合 +Rust 语法的一部分。

+

实际上,Rust 语法包含数种“语法扩展”的形式。具体来说有以下四种(顺便给出例子):

+
    +
  1. # [ $arg ] 形式:比如 #[derive(Clone)], #[no_mangle], …
  2. +
  3. # ! [ $arg ] 形式:比如 #![allow(dead_code)], #![crate_name="blang"], …
  4. +
  5. $name ! $arg 形式:比如 println!("Hi!"), concat!("a", "b"), …
  6. +
  7. $name ! $arg0 $arg1 形式:比如 macro_rules! dummy { () => {}; }.
  8. +
+

头两种形式被称作“属性” (attributes)。属性用来给条目 (items) 、表达式、语句加上注解。属性有三类:

+ +

内置的属性由编译器实现。过程宏属性和派生属性在 Rust 第二类宏系统 —— 过程宏 (procedural macros) —— 中实现。

+

我们感兴趣的是第 3 种:$name ! $arg —— 函数式 (function-like) 的宏。这种形式的宏可以通过 +macro_rules!macro 和过程宏三种方式来使用(或者说定义)。

+

注意第 3 种形式的函数式宏是一种一般的语法拓展形式,并非仅用 macro_rules! 写出。 +比如 format! 是一个 macro_rules! 宏,而用来实现 format!format_args! 不是这里谈论的宏(因为它由编译器实现,是内置的属性)。

+

第四种形式本质上是宏的变种。其实,这种形式的唯一用例只有 macro_rules!

+

所以,请将注意力集中到第 3 种形式 $name ! $arg 上,我们的问题变成,对于每种可能的语法扩展, +Rust 的语法解析器 (parser) 如何知道这里的 $arg 究竟长什么样?

+

答案是它不需要知道。其实,提供给语法扩展调用的参数只是一棵标记树 (token tree)。

+

具体来说,是一棵非叶节点 (non-leaf) 的标记树:即 (...)[...]{...}

+

知道这一点后,语法解析器如何理解如下调用形式,就变得显而易见了:

+
bitflags! {
+    struct Color: u8 {
+        const RED    = 0b0001,
+        const GREEN  = 0b0010,
+        const BLUE   = 0b0100,
+        const BRIGHT = 0b1000,
+    }
+}
+
+lazy_static! {
+    static ref FIB_100: u32 = {
+        fn fib(a: u32) -> u32 {
+            match a {
+                0 => 0,
+                1 => 1,
+                a => fib(a-1) + fib(a-2)
+            }
+        }
+
+        fib(100)
+    };
+}
+
+fn main() {
+    use Color::*;
+    let colors = vec![RED, GREEN, BLUE];
+    println!("Hello, World!");
+}
+

虽然上述调用看起来包含了各式各样的 Rust 代码,但对语法解析器来说,它们仅仅是堆无实际意义的标记树。

+

为了说明问题,我们把所有这些句法“黑盒”用 ⬚ 代替,仅剩下:

+
bitflags! ⬚
+
+lazy_static! ⬚
+
+fn main() {
+    let colors = vec! ⬚;
+    println! ⬚;
+}
+
+

再次重申,语法解析器对 ⬚ 不作任何假设;它记录黑盒所包含的标记,但并不尝试理解它们。

+

这意味着 ⬚ 可以是任何东西,甚至是无效的 Rust 语法。至于为什么这是好事,等会会谈到。

+

那么,这是否也适用于形式 1 和 2 中的 $arg,以及 4 中的两个参数的情况呢? +有点类似。形式 1 和 2 的 $arg 略有不同,因为它不是直接的标记树,而是后跟 = +标记加字符串表达式或标记树的简单路径。过程宏一章将更深入地探讨这一点。这里的重点是,该形式也使用标记树来描述输入。

+

第 4 种形式通常更特殊,它接受一种非常具体的语法,但这种语法也利用了标记树。这个形式下的具体情况在此处并不重要, +所以在涉及到它之前,暂时跳过它。

+

以下几点很重要:

+
    +
  • Rust 包含多种语法扩展。
  • +
  • 当遇见形如 $name! $arg 的结构时,它可能是其它语法扩展,比如 macro_rules! 宏、过程宏甚至内置宏。
  • +
  • 所有 ! 宏(即第 3 种形式)的输入都是非叶节点的单个标记树。
  • +
  • 语法扩展都将作为抽象语法树 (AST) 的一部分被解析。
  • +
+

最后一点最为重要,它带来了一些深远的影响。由于语法拓展将被解析进 AST +中,它们只能出现在那些明确支持它们出现的位置。具体来说,语法拓展能在如下位置出现:

+
    +
  • 模式 (pattern)
  • +
  • 语句 (statement)
  • +
  • 表达式 (expression)
  • +
  • 条目 (item) (包括 impl 块)
  • +
  • 类型
  • +
+

一些并不支持的位置包括:

+
    +
  • 标识符 (identifier)
  • +
  • match 分支
  • +
  • 结构体的字段
  • +
+

在上述第一个列表(支持的位置)之外,绝对没有任何地方有使用语法拓展的可能。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/syntax-extensions/debugging.html b/syntax-extensions/debugging.html new file mode 100644 index 0000000..1c3a928 --- /dev/null +++ b/syntax-extensions/debugging.html @@ -0,0 +1,339 @@ + + + + + + 调试 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

调试

+

rustc 提供了许多工具来调试通用的语法扩展,并且针对声明宏和过程宏分别量身定制的一些更具体的工具。

+

有时,语法扩展所展开的内容会有问题,因为你通常看不到展开的的代码。幸运的是, rustc +通过不稳定的 -Zunpretty=expanded 参数来提供查看展开代码的功能。假设有以下代码:

+
// Shorthand for initializing a `String`.
+macro_rules! S {
+    ($e:expr) => {String::from($e)};
+}
+
+fn main() {
+    let world = S!("World");
+    println!("Hello, {}!", world);
+}
+

使用以下命令编译:

+
rustc +nightly -Zunpretty=expanded hello.rs
+
+

生成以下输出(针对格式进行了修改):

+
#![feature(prelude_import)]
+#[prelude_import]
+use std::prelude::rust_2018::*;
+#[macro_use]
+extern crate std;
+// Shorthand for initializing a `String`.
+macro_rules! S { ($e : expr) => { String :: from($e) } ; }
+
+fn main() {
+    let world = String::from("World");
+    {
+        ::std::io::_print(
+            ::core::fmt::Arguments::new_v1(
+                &["Hello, ", "!\n"],
+                &match (&world,) {
+                    (arg0,) => [
+                        ::core::fmt::ArgumentV1::new(arg0, ::core::fmt::Display::fmt)
+                    ],
+                }
+            )
+        );
+    };
+}
+

除了 rustc 公开了一些方式帮助调试语法扩展之外,对于这里提到的 -Zunpretty=expanded +选项,由 dtolnay 制作的名为 +cargo-expandcargo +插件基本上对它进行了包装,使用起来更加方便。

+

你也可以使用 playground,点击右上角的 TOOLS 按钮来展开语法扩展!

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/syntax-extensions/expansion.html b/syntax-extensions/expansion.html new file mode 100644 index 0000000..6852447 --- /dev/null +++ b/syntax-extensions/expansion.html @@ -0,0 +1,367 @@ + + + + + + 宏展开 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

展开

+

展开相对简单。在生成 AST 之后,和编译器对程序进行语义理解之前,编译器将会对所有语法拓展进行展开。

+

这一过程包括:遍历 AST,确定所有语法拓展调用的位置,并把它们替换成展开的内容。

+

每当编译器遇见一个语法扩展,都会根据上下文解析成有限语法元素集中的一个。

+

举例来说,如果在模块作用域内调用语法拓展,那么编译器就将它的展开结果解析为表示某项条目 (item) 的 AST +节点;如果在表达式的位置上调用语法拓展,那么编译器就将它的展开结果解析为表示表达式的 AST 节点。

+

事实上,一个语义扩展的展开结果会变成以下一种情况:

+
    +
  • 一个表达式
  • +
  • 一个模式
  • +
  • 一个类型
  • +
  • 零或多个条目(包括的 impl 块)
  • +
  • 零或多个语句
  • +
+

换句话讲,语法拓展调用所在的位置,决定了该语法拓展展开结果被解读的方式。

+

编译器会操作 AST 节点,把语法拓展调用处的节点完全替换成输出的节点。这一替换是结构性 (structural) +的,而非织构性 (textural) 的。

+

比如思考以下代码:

+
let eight = 2 * four!();
+

我们可将这部分 AST 可视化地表示为:

+
┌─────────────┐
+│ Let         │
+│ name: eight │   ┌─────────┐
+│ init: ◌     │╶─╴│ BinOp   │
+└─────────────┘   │ op: Mul │
+                ┌╴│ lhs: ◌  │
+     ┌────────┐ │ │ rhs: ◌  │╶┐ ┌────────────┐
+     │ LitInt │╶┘ └─────────┘ └╴│ Macro      │
+     │ val: 2 │                 │ name: four │
+     └────────┘                 │ body: ()   │
+                                └────────────┘
+
+

根据上下文,four!() 必须展开成一个表达式(initializer +只可能是表达式)。因此,无论实际展开的结果如何,它都将被解读成一个完整的表达式。

+

此处假设 four! 成其展开结果为表达式 1 + 3。故而,展开后将 AST 变为:

+
┌─────────────┐
+│ Let         │
+│ name: eight │   ┌─────────┐
+│ init: ◌     │╶─╴│ BinOp   │
+└─────────────┘   │ op: Mul │
+                ┌╴│ lhs: ◌  │
+     ┌────────┐ │ │ rhs: ◌  │╶┐ ┌─────────┐
+     │ LitInt │╶┘ └─────────┘ └╴│ BinOp   │
+     │ val: 2 │                 │ op: Add │
+     └────────┘               ┌╴│ lhs: ◌  │
+                   ┌────────┐ │ │ rhs: ◌  │╶┐ ┌────────┐
+                   │ LitInt │╶┘ └─────────┘ └╴│ LitInt │
+                   │ val: 1 │                 │ val: 3 │
+                   └────────┘                 └────────┘
+
+

这又能被重写成:

+
let eight = 2 * (1 + 3);
+

注意,虽然表达式本身不包含括号,但这里仍然加上了它们。这是因为,编译器总是将语法拓展的展开结果看作完整的 +AST 节点,而不是仅仅把它视为一列标记。

+

换句话说,即便不显式地把复杂的表达式用括号包起来,编译器也不可能“错意”语法拓展替换的结果,或者改变求值顺序。

+

语法拓展被当作 AST 节点展开,这一观点非常重要,它造成两大影响:

+
    +
  • 语法拓展不仅调用位置有限制,其展开结果也只能跟语法解析器在该位置所预期的 AST 节点种类一致。
  • +
  • 因此,语法拓展必定无法展开成不完整或不合语法的结构。
  • +
+

有关展开还有一点值得注意:如果某语法扩展的展开结果包含另一个语法扩展调用,那会怎么样?

+

例如,上述 four! 如果被展开成了 1 + three!(),会发生什么?

+
let x = four!();
+

展开成:

+
let x = 1 + three!();
+

编译器将会检查扩展结果中是否包含更多的语法拓展调用;如果有,它们将被进一步展开。

+

因此,上述 AST 节点将被再次展开成:

+
let x = 1 + 3;
+

这里的要点是,语法拓展展开发生在“传递”过程中;要完全展开所有调用,就需要同样多的传递。

+

嗯,也不全是如此。事实上,编译器为此设置了一个上限。它被称作语法拓展的递归上限,默认值为 128。如果第 +128 次展开结果仍然包含语法拓展调用,编译器将会终止并返回一个递归上限溢出的错误信息。

+

此上限可通过 #![recursion_limit="…"] 来提高,但这种改写必须是 crate +级别的。 一般来讲,可能的话最好还是尽量让语法拓展展开递归次数保持在默认值以下,因为会影响编译时间。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/syntax-extensions/hygiene.html b/syntax-extensions/hygiene.html new file mode 100644 index 0000000..60d5325 --- /dev/null +++ b/syntax-extensions/hygiene.html @@ -0,0 +1,337 @@ + + + + + + 卫生性 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

卫生性

+

卫生性 (hygiene) 是宏的一个重要概念。它描述了宏在其语法上下文中工作的能力:不影响或不受其周围环境的影响。

+

换句话说,这意味着语法扩展应该可以在任何地方调用,而不会干扰其周围的上下文。

+

在一个完美的世界里,Rust 中的所有语法扩展都是完全卫生的 +(fully hygienic),不幸的是情况并非如此,所以应该注意避免编写不是完全卫生的语法扩展。

+

我们将在这里深入讨论一般的卫生性概念,这些概念会在 Rust 提供的不同语法扩展的相应的卫生性章节中涉及到。

+

卫生性主要影响从语法扩展产生的标识符和路径。

+

简而言之,如果由语法扩展创建的标识符不能被调用该语法扩展的环境访问,那么它对于该标识符是卫生的。

+

同样,如果语法扩展中使用的标识符不能引用到在语法扩展之外定义的内容,则被认为是卫生的。

+
+

注意:这里说的“创建”和“使用”是指该标识所在的位置。

+

之所以说 struct Foo{} 中的 Foolet foo = …; 中的 foo +是被创建的,是因为在某种角度看,它们在其名字下引入了新的东西。

+

而之所以说 fn foo(_: Foo) {} 中的 Foofoo + 3 中的 foo +是被使用的,是因为从某种角度看,它们正指向某些已存在的东西。

+
+

最好的例子用例子来展示。假设某语法扩展 make_local 展开为 +let local = 0;,也就是说,它创建了标识符 local,然后假设有以下代码:

+
macro_rules! make_local {
+    () => { let local = 0; }
+}
+fn main() {
+    make_local!();
+    assert_eq!(local, 0);
+}
+

如果 assert_eq!(local, 0); 中的 local 被解析为语法扩展所定义的 +local,则语法扩展不是卫生的(至少在 local 这个名称/绑定方面不是卫生的)。

+

现在假设有某语法扩展 use_local 展开为 local = 42;,也就是说,它使用了标识符 local,然后假设有以下代码:

+
// 注释这段声明宏的定义看看会发生什么
+macro_rules! use_local {
+    () => { local = 42; }
+}
+fn main() {
+    let mut local = 0;
+    // 取消注释这段声明宏的定义看看会发生什么
+    // macro_rules! use_local {
+    //     () => { local = 42; }
+    // }
+    use_local!();
+}
+

如果给定调用的语法扩展中的 local 被解析为调用前所定义的 local ,则该语法扩展也不是卫生的。

+

这简短地介绍了卫生性的一般概念。它将在相应的 macro_rules! +和 proc-macro 章节里进行更深入的解释,并阐述其各自的特有之处。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/syntax-extensions/source-analysis.html b/syntax-extensions/source-analysis.html new file mode 100644 index 0000000..edb0e70 --- /dev/null +++ b/syntax-extensions/source-analysis.html @@ -0,0 +1,421 @@ + + + + + + 源代码分析 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

源代码解析方式

+

标识化 (Tokenization)

+

Rust程序编译过程的第一阶段是 标记解析。 +在这一过程中,源代码将被转换成一系列的标记 (token)。

+
+

token:无法被分割的词法单元;在编程语言世界中等价于“单词”。

+
+

Rust包含多种标记,比如:

+
    +
  • 标识符 (identifiers): foo, Bambous, self, we_can_dance, LaCaravane, …
  • +
  • 字面值 (literals): 42, 72u32, 0_______0, 1.0e-40, "ferris was here", …
  • +
  • 关键字 (keywords): _, fn, self, match, yield, macro, …
  • +
  • 符号 (symbols): [, :, ::, ?, ~, @1, …
  • +
+

等等

+

有些地方值得注意:

+
    +
  1. +

    self 既是一个标识符又是一个关键词。 +几乎在所有情况下它都被视作是一个关键词,但它有可能被视为标识符。 +我们稍后会(骂骂咧咧地)提到这种情况。

    +
  2. +
  3. +

    关键词里列有一些可疑的家伙,比如 yieldmacro。 +它们在当前的Rust语言中并没有任何含义,但编译器的确会把它们视作关键词进行解析。 +这些词语被保留作语言未来扩充时使用。

    +
  4. +
  5. +

    符号里也列有一些未被当前语言使用的条目。比如 <-,这是历史残留: +目前它被移除了Rust语法,但词法分析器仍然没丢掉它。

    +
  6. +
  7. +

    注意 :: 被视作一个独立的标记,而非两个连续的 : 。 +这一规则适用于截至 Rust 1.2 版本的所有的多字符符号标记。 +2

    +
  8. +
+
1 +

@ 被用在模式中,用来绑定模式非终止的部分到一个名称——但这似乎被大多数人完全地遗忘了。

+
+
2 +

严格来说, Rust 1.52 版本中存在两个词法分析器 (lexer): +rustc_lexer 只将单个字符作为 标记 (tokens); +rustc_parse 里的 lexer 把多个字符作为不同的 标记 (tokens)。

+
+

作为对比,某些语言的宏系统正扎根于这一阶段。Rust并非如此。 +举例来说,从效果来看,C/C++的宏就是在这里得到处理的。3 +这也正是下列代码能够运行的原因: +4

+
#define SUB void
+#define BEGIN {
+#define END }
+
+SUB main() BEGIN
+    printf("Oh, the horror!\n");
+END
+
+
3
+

实际上,C 预处理程序使用与 C 自身所不同的词法结构,但这些区别很大程度上无关紧要。

+
4
+

是否应该这样运行完全是一个另外的话题了。

+

语法解析 (Parsing)

+

编译过程的下一个阶段是语法解析 (parsing)。

+

这一过程中,一系列的 token 将被转换成一棵抽象语法树 (AST: Abstract Syntax Tree)。 +此过程将在内存中建立起程序的语法结构。

+

举例来说,标记序列 1+2 将被转换成某种类似于:

+
┌─────────┐   ┌─────────┐
+│ BinOp   │ ┌╴│ LitInt  │
+│ op: Add │ │ │ val: 1  │
+│ lhs: ◌  │╶┘ └─────────┘
+│ rhs: ◌  │╶┐ ┌─────────┐
+└─────────┘ └╴│ LitInt  │
+              │ val: 2  │
+              └─────────┘
+
+

AST 将包含 整个 程序的结构,但这一结构仅包含词法信息。

+

举例来讲,在这个阶段编译器虽然可能知道某个表达式提及了某个名为 a 的变量, +但它并 没有办法知道 a 究竟是什么,或者它从哪来。

+

在 AST 生成之后,宏处理过程才开始。 +但在讨论宏处理过程之前,我们需要先谈谈标记树 (token tree)。

+

标记树 (Token Trees)

+

标记树是介于 标记 (token) 与 AST 之间的东西。

+

首先明确一点,几乎所有标记都构成标记树。 +具体来说,它们可被看作标记树叶节点。 +还有另一类事物也可被看作标记树叶节点,我们将在稍后提到它。

+

仅有的一种基础标记不是标记树叶节点——“分组”标记:(...)[...]{...}。 +这三者属于标记树内的节点,正是它们给标记树带来了树状的结构。

+

给个具体的例子,这列标记:

+
a + b + (c + d[0]) + e
+
+

将被解析为这样的标记树:

+
«a» «+» «b» «+» «(   )» «+» «e»
+          ╭────────┴──────────╮
+           «c» «+» «d» «[   ]»
+                        ╭─┴─╮
+                         «0»
+
+

注意它跟最后生成的 AST 并 没有关联。 +AST 将仅有一个根节点,而这棵标记树有 个。 +作为参考,最后生成的 AST 应该是这样:

+
              ┌─────────┐
+              │ BinOp   │
+              │ op: Add │
+            ┌╴│ lhs: ◌  │
+┌─────────┐ │ │ rhs: ◌  │╶┐ ┌─────────┐
+│ Var     │╶┘ └─────────┘ └╴│ BinOp   │
+│ name: a │                 │ op: Add │
+└─────────┘               ┌╴│ lhs: ◌  │
+              ┌─────────┐ │ │ rhs: ◌  │╶┐ ┌─────────┐
+              │ Var     │╶┘ └─────────┘ └╴│ BinOp   │
+              │ name: b │                 │ op: Add │
+              └─────────┘               ┌╴│ lhs: ◌  │
+                            ┌─────────┐ │ │ rhs: ◌  │╶┐ ┌─────────┐
+                            │ BinOp   │╶┘ └─────────┘ └╴│ Var     │
+                            │ op: Add │                 │ name: e │
+                          ┌╴│ lhs: ◌  │                 └─────────┘
+              ┌─────────┐ │ │ rhs: ◌  │╶┐ ┌─────────┐
+              │ Var     │╶┘ └─────────┘ └╴│ Index   │
+              │ name: c │               ┌╴│ arr: ◌  │
+              └─────────┘   ┌─────────┐ │ │ ind: ◌  │╶┐ ┌─────────┐
+                            │ Var     │╶┘ └─────────┘ └╴│ LitInt  │
+                            │ name: d │                 │ val: 0  │
+                            └─────────┘                 └─────────┘
+
+

理解 AST 与 标记树 (token tree) 之间的区别至关重要。 +写宏时,你将同时与这两者打交道。

+

还有一条需要注意:不可能 出现不匹配的小/中/大括号,也不可能存在包含错误嵌套结构的标记树。

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/theme-dawn.js b/theme-dawn.js new file mode 100644 index 0000000..ebc0c6b --- /dev/null +++ b/theme-dawn.js @@ -0,0 +1,7 @@ +ace.define("ace/theme/dawn",["require","exports","module","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-xcode",t.cssText="/* THIS THEME WAS AUTOGENERATED BY Theme.tmpl.css (UUID: EE3AD170-2B7F-4DE1-B724-C75F13FE0085) */ .ace-xcode .ace_gutter { background: #e8e8e8; color: #333 } .ace-xcode .ace_print-margin { width: 1px; background: #e8e8e8 } .ace-xcode { background-color: #FFFFFF; color: #000000 } .ace-xcode .ace_cursor { color: #000000 } .ace-xcode .ace_marker-layer .ace_selection { background: #B5D5FF } .ace-xcode.ace_multiselect .ace_selection.ace_start { box-shadow: 0 0 3px 0px #FFFFFF; } .ace-xcode .ace_marker-layer .ace_step { background: rgb(198, 219, 174) } .ace-xcode .ace_marker-layer .ace_bracket { margin: -1px 0 0 -1px; border: 1px solid #BFBFBF } .ace-xcode .ace_marker-layer .ace_active-line { background: rgba(0, 0, 0, 0.071) } .ace-xcode .ace_gutter-active-line { background-color: rgba(0, 0, 0, 0.071) } .ace-xcode .ace_marker-layer .ace_selected-word { border: 1px solid #B5D5FF } .ace-xcode .ace_constant.ace_language, .ace-xcode .ace_keyword, .ace-xcode .ace_meta, .ace-xcode .ace_variable.ace_language { color: #C800A4 } .ace-xcode .ace_invisible { color: #BFBFBF } .ace-xcode .ace_constant.ace_character, .ace-xcode .ace_constant.ace_other { color: #275A5E } .ace-xcode .ace_constant.ace_numeric { color: #3A00DC } .ace-xcode .ace_entity.ace_other.ace_attribute-name, .ace-xcode .ace_support.ace_constant, .ace-xcode .ace_support.ace_function { color: #450084 } .ace-xcode .ace_fold { background-color: #C800A4; border-color: #000000 } .ace-xcode .ace_entity.ace_name.ace_tag, .ace-xcode .ace_support.ace_class, .ace-xcode .ace_support.ace_type { color: #790EAD } .ace-xcode .ace_storage { color: #C900A4 } .ace-xcode .ace_string { color: #DF0002 } .ace-xcode .ace_comment { color: #008E00 } .ace-xcode .ace_indent-guide { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==) right repeat-y }";var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)}); (function() { + ace.require(["ace/theme/dawn"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); diff --git a/theme-tomorrow_night.js b/theme-tomorrow_night.js new file mode 100644 index 0000000..7be8155 --- /dev/null +++ b/theme-tomorrow_night.js @@ -0,0 +1,7 @@ +ace.define("ace/theme/tomorrow_night",["require","exports","module","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-monokai",t.cssText=".ace-monokai .ace_gutter { background: #2F3129; color: #8F908A } .ace-monokai .ace_print-margin { width: 1px; background: #555651 } .ace-monokai { background-color: #272822; color: #F8F8F2 } .ace-monokai .ace_cursor { color: #F8F8F0 } .ace-monokai .ace_marker-layer .ace_selection { background: #49483E } .ace-monokai.ace_multiselect .ace_selection.ace_start { box-shadow: 0 0 3px 0px #272822; } .ace-monokai .ace_marker-layer .ace_step { background: rgb(102, 82, 0) } .ace-monokai .ace_marker-layer .ace_bracket { margin: -1px 0 0 -1px; border: 1px solid #49483E } .ace-monokai .ace_marker-layer .ace_active-line { background: #202020 } .ace-monokai .ace_gutter-active-line { background-color: #272727 } .ace-monokai .ace_marker-layer .ace_selected-word { border: 1px solid #49483E } .ace-monokai .ace_invisible { color: #52524d } .ace-monokai .ace_entity.ace_name.ace_tag, .ace-monokai .ace_keyword, .ace-monokai .ace_meta.ace_tag, .ace-monokai .ace_storage { color: #F92672 } .ace-monokai .ace_punctuation, .ace-monokai .ace_punctuation.ace_tag { color: #fff } .ace-monokai .ace_constant.ace_character, .ace-monokai .ace_constant.ace_language, .ace-monokai .ace_constant.ace_numeric, .ace-monokai .ace_constant.ace_other { color: #AE81FF } .ace-monokai .ace_invalid { color: #F8F8F0; background-color: #F92672 } .ace-monokai .ace_invalid.ace_deprecated { color: #F8F8F0; background-color: #AE81FF } .ace-monokai .ace_support.ace_constant, .ace-monokai .ace_support.ace_function { color: #66D9EF } .ace-monokai .ace_fold { background-color: #A6E22E; border-color: #F8F8F2 } .ace-monokai .ace_storage.ace_type, .ace-monokai .ace_support.ace_class, .ace-monokai .ace_support.ace_type { font-style: italic; color: #66D9EF } .ace-monokai .ace_entity.ace_name.ace_function, .ace-monokai .ace_entity.ace_other, .ace-monokai .ace_entity.ace_other.ace_attribute-name, .ace-monokai .ace_variable { color: #A6E22E } .ace-monokai .ace_variable.ace_parameter { font-style: italic; color: #FD971F } .ace-monokai .ace_string { color: #E6DB74 } .ace-monokai .ace_comment { color: #75715E } .ace-monokai .ace_indent-guide { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y }";var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)}); (function() { + ace.require(["ace/theme/tomorrow_night"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); diff --git a/theme/pagetoc.css b/theme/pagetoc.css new file mode 100644 index 0000000..a68e5b8 --- /dev/null +++ b/theme/pagetoc.css @@ -0,0 +1,47 @@ +/* src: https://github.com/JorelAli/mdBook-pagetoc */ + +@media only screen and (max-width:1439px) { + .sidetoc { + display: none; + } +} + +@media only screen and (min-width:1440px) { + main { + position: relative; + } + .sidetoc { + margin-left: auto; + margin-right: auto; + /* left: calc(90% + (var(--content-min-width))/4 - 110px); */ + left: 101%; + position: absolute; + font-size: var(--pagetoc-fontsize); + } + .pagetoc { + position: fixed; + width: var(--pagetoc-width); + } + .pagetoc a { + border-left: 1px solid var(--sidebar-bg); + /* color: var(--fg); */ + /* color: var(--sidebar-fg); */ + color: var(--links); + display: block; + padding-bottom: 5px; + padding-top: 5px; + padding-left: 10px; + text-align: left; + text-decoration: none; + font-weight: normal; + background: var(--sidebar-bg); + } + .pagetoc a:hover, + .pagetoc a.active { + background: var(--sidebar-bg); + /* color: var(--sidebar-fg); */ + color: var(--sidebar-active); + font-weight: bold; + font-size: var(--pagetoc-fontsize); + } +} diff --git a/theme/pagetoc.js b/theme/pagetoc.js new file mode 100644 index 0000000..b110524 --- /dev/null +++ b/theme/pagetoc.js @@ -0,0 +1,68 @@ +// src: https://github.com/JorelAli/mdBook-pagetoc + +// Un-active everything when you click it +Array.prototype.forEach.call(document.getElementsByClassName("pagetoc")[0].children, function(el, i) { + el.addEventHandler("click", function() { + Array.prototype.forEach.call(document.getElementsByClassName("pagetoc")[0].children, function(el, i) { + el.classList.remove("active"); + }); + el.classList.add("active"); + }); +}); + +var updateFunction = function() { + + var id; + var elements = document.getElementsByClassName("header"); + Array.prototype.forEach.call(elements, function(el, i) { + if (window.pageYOffset >= el.offsetTop) { + id = el; + } + }); + + Array.prototype.forEach.call(document.getElementsByClassName("pagetoc")[0].children, function(el, i) { + el.classList.remove("active"); + }); + + Array.prototype.forEach.call(document.getElementsByClassName("pagetoc")[0].children, function(el, i) { + if (id.href.localeCompare(el.href) == 0) { + el.classList.add("active"); + } + }); +}; + +// Populate sidebar on load +window.addEventListener('load', function() { + var pagetoc = document.getElementsByClassName("pagetoc")[0]; + var elements = document.getElementsByClassName("header"); + Array.prototype.forEach.call(elements, function(el, i) { + var link = document.createElement("a"); + + // Indent shows hierarchy + var indent = ""; + switch (el.parentElement.tagName) { + case "H2": + indent = "20px"; + break; + case "H3": + indent = "40px"; + break; + case "H4": + indent = "60px"; + break; + default: + break; + } + + link.appendChild(document.createTextNode(el.text)); + link.style.paddingLeft = indent; + link.href = el.href; + pagetoc.appendChild(link); + }); + updateFunction.call(); +}); + + + +// Handle active elements on scroll +window.addEventListener("scroll", updateFunction); diff --git a/theme/rust-syntax-bg-highlight.css b/theme/rust-syntax-bg-highlight.css new file mode 100644 index 0000000..67c174b --- /dev/null +++ b/theme/rust-syntax-bg-highlight.css @@ -0,0 +1,36 @@ +/** + * Copyright 2013-2014 The Rust Project Developers. See the COPYRIGHT + * file at the top-level directory of this distribution and at + * http://rust-lang.org/COPYRIGHT. + * With elements taken from Bootstrap v3.0.2 (MIT licensed). + * + * Licensed under the Apache License, Version 2.0 or the MIT license + * , at your + * option. This file may not be copied, modified, or distributed + * except according to those terms. + * + * Modified by Daniel Keep. + */ + + +/* Code highlighting */ +pre.rust .kw { color: #f92672; } +pre.rust .kw-2 { color: #f92672; } +pre.rust .prelude-ty { color: #66d9ef; } +pre.rust .number { color: #EFD6AB; } +pre.rust .string { color: #F8E9A5; } +pre.rust .self { color: #f92672; } +pre.rust .boolval { color: #EFD6AB; } +pre.rust .prelude-val { color: #66d9ef; } +pre.rust .attribute { color: #C7AFD1; } +pre.rust .attribute .ident { color: #D4BBDE; } +pre.rust .comment { color: #75715e; } +pre.rust .doccomment { color: #75715e; } +pre.rust .macro { color: #AC7FE7; } +pre.rust .macro-nonterminal { color: #CFC0E2; } +pre.rust .lifetime { color: #B76514; } +pre.rust .op { color: #f92672; } + +pre.rust .synctx-0 { background-color: rgba(255, 0, 0, 0.1); } +pre.rust .synctx-1 { background-color: rgba(0, 255, 0, 0.1); } diff --git a/toc.html b/toc.html new file mode 100644 index 0000000..fd96ba2 --- /dev/null +++ b/toc.html @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + +
  1. 简介
  2. 语法拓展
    1. 源代码分析
    2. AST 中的宏
    3. 宏展开
    4. 卫生性
    5. 调试
  3. 声明宏
    1. 思路
    2. 实战
    3. 细节
      1. 片段分类符
      2. 再谈元变量与宏展开
      3. 元变量表达式
      4. 宏是部分“卫生的”
      5. 非标识符的“标识符”
      6. 调试
      7. 作用域
      8. 导入/导出宏
      9. macro 2.0
    4. 模式
      1. 回调
      2. tt “撕咬机“
      3. 内用规则
      4. 下推累积
      5. 反复替换
      6. tt 捆绑
    5. 构件
      1. AST 强制转换
      2. 计数
        1. 算盘计数
      3. 解析
  4. 过程宏
    1. 思路
      1. 函数式
      2. 属性式
      3. derive 式
    2. 实战
    3. 第三方 crates
    4. 卫生性和 Span
    5. 技巧
  5. 翻译说明
+ + diff --git a/toc.js b/toc.js new file mode 100644 index 0000000..cd25735 --- /dev/null +++ b/toc.js @@ -0,0 +1,70 @@ +// Populate the sidebar +// +// This is a script, and not included directly in the page, to control the total size of the book. +// The TOC contains an entry for each page, so if each page includes a copy of the TOC, +// the total size of the page becomes O(n**2). +class MDBookSidebarScrollbox extends HTMLElement { + constructor() { + super(); + } + connectedCallback() { + this.innerHTML = '
  1. 简介
  2. 语法拓展
    1. 源代码分析
    2. AST 中的宏
    3. 宏展开
    4. 卫生性
    5. 调试
  3. 声明宏
    1. 思路
    2. 实战
    3. 细节
      1. 片段分类符
      2. 再谈元变量与宏展开
      3. 元变量表达式
      4. 宏是部分“卫生的”
      5. 非标识符的“标识符”
      6. 调试
      7. 作用域
      8. 导入/导出宏
      9. macro 2.0
    4. 模式
      1. 回调
      2. tt “撕咬机“
      3. 内用规则
      4. 下推累积
      5. 反复替换
      6. tt 捆绑
    5. 构件
      1. AST 强制转换
      2. 计数
        1. 算盘计数
      3. 解析
  4. 过程宏
    1. 思路
      1. 函数式
      2. 属性式
      3. derive 式
    2. 实战
    3. 第三方 crates
    4. 卫生性和 Span
    5. 技巧
  5. 翻译说明
'; + // Set the current, active page, and reveal it if it's hidden + let current_page = document.location.href.toString(); + if (current_page.endsWith("/")) { + current_page += "index.html"; + } + var links = Array.prototype.slice.call(this.querySelectorAll("a")); + var l = links.length; + for (var i = 0; i < l; ++i) { + var link = links[i]; + var href = link.getAttribute("href"); + if (href && !href.startsWith("#") && !/^(?:[a-z+]+:)?\/\//.test(href)) { + link.href = path_to_root + href; + } + // The "index" page is supposed to alias the first chapter in the book. + if (link.href === current_page || (i === 0 && path_to_root === "" && current_page.endsWith("/index.html"))) { + link.classList.add("active"); + var parent = link.parentElement; + if (parent && parent.classList.contains("chapter-item")) { + parent.classList.add("expanded"); + } + while (parent) { + if (parent.tagName === "LI" && parent.previousElementSibling) { + if (parent.previousElementSibling.classList.contains("chapter-item")) { + parent.previousElementSibling.classList.add("expanded"); + } + } + parent = parent.parentElement; + } + } + } + // Track and set sidebar scroll position + this.addEventListener('click', function(e) { + if (e.target.tagName === 'A') { + sessionStorage.setItem('sidebar-scroll', this.scrollTop); + } + }, { passive: true }); + var sidebarScrollTop = sessionStorage.getItem('sidebar-scroll'); + sessionStorage.removeItem('sidebar-scroll'); + if (sidebarScrollTop) { + // preserve sidebar scroll position when navigating via links within sidebar + this.scrollTop = sidebarScrollTop; + } else { + // scroll sidebar to current active section when navigating via "next/previous chapter" buttons + var activeSection = document.querySelector('#sidebar .active'); + if (activeSection) { + activeSection.scrollIntoView({ block: 'center' }); + } + } + // Toggle buttons + var sidebarAnchorToggles = document.querySelectorAll('#sidebar a.toggle'); + function toggleSection(ev) { + ev.currentTarget.parentElement.classList.toggle('expanded'); + } + Array.from(sidebarAnchorToggles).forEach(function (el) { + el.addEventListener('click', toggleSection); + }); + } +} +window.customElements.define("mdbook-sidebar-scrollbox", MDBookSidebarScrollbox); diff --git a/tomorrow-night.css b/tomorrow-night.css new file mode 100644 index 0000000..11752b8 --- /dev/null +++ b/tomorrow-night.css @@ -0,0 +1,104 @@ +/* Tomorrow Night Theme */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment { + color: #969896; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-attribute, +.hljs-attr, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #cc6666; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #de935f; +} + +/* Tomorrow Yellow */ +.ruby .hljs-class .hljs-title, +.css .hljs-rule .hljs-attribute { + color: #f0c674; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.hljs-name, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #b5bd68; +} + +/* Tomorrow Aqua */ +.hljs-title, +.hljs-section, +.css .hljs-hexcolor { + color: #8abeb7; +} + +/* Tomorrow Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #81a2be; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #b294bb; +} + +.hljs { + display: block; + overflow-x: auto; + background: #1d1f21; + color: #c5c8c6; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} + +.hljs-addition { + color: #718c00; +} + +.hljs-deletion { + color: #c82829; +} diff --git a/translation_statement.html b/translation_statement.html new file mode 100644 index 0000000..5019c22 --- /dev/null +++ b/translation_statement.html @@ -0,0 +1,350 @@ + + + + + + 翻译说明 - The Little Book of Rust Macros (Rust 宏小册) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +

翻译说明

+

本书是续写版本,续写的版本由 Veykril 撰稿,续作对原作有补充和删改。

+ +

原作及其翻译渲染版本没有使用 mdbook 构建,而是使用 py 来生成 HTML。 +在发布文档和运行样板代码方面诸多不便。

+

而且由于原作在 2016 年没再更新,其内容基于 Rust 2015 版本, +续写的版本也只是把过时的细节更新至 2018 之后的版本。

+

我认为这本书在阐述 声明宏 方面搭建了一个很小巧精美的骨架,过程宏的资料比较丰富,而且过程宏生态主要围绕第三方库开展。

+

续作及本翻译渲染版本使用 mdbook 构建:

+ +

另外,此翻译版本提供的阅读功能:

+
    +
  1. 行间代码块大部分可以点击右上角按钮运行,有些可以 编辑 和运行 +(目的是快速而方便地验证读者思考的代码能否编译通过)。 +只用于展示说明、或者不适合运行的代码只有复制按钮。
  2. +
+
+

区分能编辑代码块的方法:光标能够在代码块中停留和闪动;有同级竖线;右上角有 +undo 图标;选中代码时背景色较浅;看代码块的主题颜色。

+
+
    +
  1. +

    每个页面右侧都有本章节的 大纲目录 ,可以点击跳转。 +如果大纲目录显示不完整,可以缩小浏览器页面;或者收起左侧的章节目录。 +大纲目录仅在电脑网页版生效,移动端网页不会显示。

    +
  2. +
  3. +

    所有 code 蓝色样式、光标移上去有下划线的内容(普通正文或者行内代码)都是链接,可以跳转。 +无链接的行内代码样式是这样的:code

    +
  4. +
  5. +

    翻译专有名词时,给出原英文,因为我认为那些词语是初次阅读英文时的障碍, +所以当读者查阅其他英文资料时,就不会感到陌生了。

    +
  6. +
+

更新日志

+

2022.04

+

主要补充的部分在于:

+ +

2021.06

+

主要补充的部分在于:

+ + +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +